  /* this is a script to choose a dominant color and then derive an accent color,
    a border color, a copy font color and a headline color.


    one of ht ekeys here is some notion of color"distance"


    i.e. a header (for legibility) should be 50% more contrasty then a base color
    a copy color should be 60% more contrasty.

    contrast is 70% luminance delta and 30% hue delta

    from a hsv standpoint the body font and background color should not deviate more than 20%

    accent color should have 120% contrast ( saturation = 100%  hue + value = 120%)


    variables-- (intended_contrast) --slider to adjust allowable contrast.
                (base_color) this color is used to help push a desirable shceme
                the base color is used for the background so as to blend with a principal picture.

    */




    // these are so my array ref are readable
    var regexK      = /kustomize=1/i
    var colors      ={
                    "accentColor":              [],
                    "headerFontColor":          [],
                    "baseColor":                ["#ffffff","255,255,255"],
                    "bodyFontColor":            ["64,64,64"],
                    "panelColor":               ["216,216,216","216,216,244"],
                    "linkFontColor":            ["0,0,255"],
                    "shadowColor":              [],
                    "deepShadowColor" :         ["100,100,100", "black"]
                     }
    var kustomizer = {
    //constants
        _hue:       0,
        _sat:       1,
        _bri:       2,
        range:      255,

    /* member vars */
        currentHSB:        [],
        currentRGB:        [],
        newRGB:            [],
        colorInput:        null,
        images:            {},
        mastheadHeight:    200,

    /* initialization*/
    save: function(){
        kustomizer.colorInput.value = kustomizer.currentRGB;
        var saveString =";{"
        for (image in kustomizer.images)
            saveString += "'"+image + "':'"+kustomizer.images[image]+"',";
        saveString += "'foo':'bar'}";
        saveString += ";" + kustomizer.mastheadHeight;

        kustomizer.colorInput.value = kustomizer.currentRGB + saveString
        document.forms.kustomizer_form.submit();
    },
    revert: function(){

        kustomizer.colorInput.value = kustomizer.originalInput;
        if (kustomizer.extract())
        {
            kustomizer.derivePalette(kustomizer.currentRGB,"rgb");
            kustomizer.renderImages();
        }
    },
    showUploading: function()
    {
        document.getElementById("kustomizer.imageBrowser").innerHTML = ""+
            "<table><td style=\"vertical-align:center;\">"+
            "<img src=\"images/palette/spinner.gif\" width=\"24\" height=\"24\" "+
            "alt=\"\"></td><td style=\"vertical-align:center;font:9px/11px tahoma,lucida grande,verdana;color:white\" >"+
            "<span style=\"display:block;font: 14px/16px tahoma,lucida grande,verdana\">Uploading your image...</span>"+
            "If your image is &gt; 100k this may take a while..."+
            "</td></table>"
    },
    togglepanel: function ()
    {
        var panel   = document.getElementById('kustom-panel').style
        var iframe  = document.getElementById('upload_iframe').style
        panel.display = (panel.display == "none"? "block":"none")
        iframe.display = panel.display;

    },
    extract: function()
    {
        kustomizer.colorInput       = document.getElementById("kustomize_input")
        // extraction tests, assuming I may have to deal with poor data
        if (kustomizer.colorInput  == null)
            return false;
        kustomizer.originalInput    = document.getElementById("kustomize_input").value
          // pull current color scheme if there
        if (kustomizer.colorInput.value =="")
            kustomizer.colorInput.value = "0,0,0;";
        var settings          = kustomizer.colorInput.value.split(";");
        kustomizer.currentRGB = settings[0].split(",");
        if ((settings.length > 1)&&(settings[1]!=""))
        {
            eval("kustomizer.images = "+ settings[1]);
            for (image in kustomizer.images)
            {
                 kustomizer.images[image] =  kustomizer.images[image]
                //kustomizer.images[image] = "img/" + kustomizer.images[image]
            }
        }
        if ((settings.length > 2) && settings[2] != ""){
          kustomizer.mastheadHeight=parseInt(settings[2]);
        }
        for (var i = 0;i < kustomizer.currentRGB.length ;i++);
            kustomizer.currentRGB[i] = parseInt(kustomizer.currentRGB[i]);
         return true
    },
    /* initialization*/
    init: function(){
        if (kustomizer.is_loaded)
            return;
        kustomizer.is_loaded = true;
        if(kustomizer.extract()!= true)
            return;
        kustomizer.derivePalette(kustomizer.currentRGB,"rgb");
        if (kustomizer.colorInput.getAttribute("edit") != null){
        if ((location.href.match(regexK) != null)&&(kustomizer.colorInput.getAttribute("edit") == getLogin())){
            if(kustomizer.colorInput.getAttribute("old")!= null)
                return;
            // create kustomizer panel
            var tmpEl = document.createElement("DIV")
            kustomizer.colorInput.setAttribute("old",kustomizer.colorInput.value)
            document.body.appendChild(tmpEl)
            tmpEl.innerHTML = "<div style=\"text-align:left;z-index:9999;color:black;position:absolute;"+
                                    "top:50px;padding:10px;left:10px;width:auto;height:auto;overflow:hidden;border:1px solid rgb(96,96,96);"+
                                    "background-color:rgb(168,168,168);padding-bottom:1em;\" >"+
                                    "<div><a style=\"color:rgb(0,0,128);text-decoration:none;border:0px;;\" "+
                                    "onclick=\"kustomizer.togglepanel()\" "+
                                    " href=\"#\" >"+
                                    "<img src=\"/images/palette/kustom.gif\" >"+
                                    "<br>Customize your podcast page</a></div>"+
                                        "<div id=\"kustom-panel\" style=\";font:11px/14px tahoma, lucida grande;;display:block;\" >"+
                                        "Pick a color: (click)"+
                                    "<div  id=\"colorbars\" "+
                                          "onmousedown=\"kustomizer.hideColorSelector();\" "+
                                          "onmouseup=\"kustomizer.sampleColor(event);\" "+
                                        "style=\"position:relative;margin-bottom:0em;cursor:pointer;background-image:url(/images/palette/colors.png);"+
                                        "//background-image:none;"+
                                        "//filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/palette/colors.png' "+
                                        "  sizingMethod='scale');border:1px solid black;background-color:rgb(254,254,254);width:180px;height:32px\" >"+
                                        "<img id=\"colorSelect\" src=\"/images/colorSelect.gif\" style=\"top:0px;left:0px;;position:absolute;\"></img></div>"+
                                        "Adjust Brightness: (click)"+
                                    "<div  "+
                                       "onmousedown=\"kustomizer.hideBrightSelector();\" "+
                                       "onmouseup=\"kustomizer.sampleBrightness(event);\" "+
                                       "style=\"position:relative;margin-bottom:1em;cursor:pointer;background:url(/images/palette/brightness.gif);"+
                                       "height:16px;width:180px;border:1px solid black;\" "+
                                       "width=\"180\" height=\"11\" alt=\"\">"+
                                       "<img src=\"/images/brightSelect.gif\" id=\"brightSelect\" style=\"top:-2px;left:0px;;position:absolute;\" /></div>"+
                                           "Drag and Drop images onto <br />your header or background"+
                                    "<div   id=\"kustomizer.imageBrowser\" "+
                                            "style=\"position:relative;width:250px;height:130px;overflow:auto;border:1px solid rgb(128,128,128);border-bottom:none;\"></div>"+
                                            "<iframe id=\"upload_iframe\" src='"+ podomatic.serverPath+"/uploadpictures.html' style='display:block;;width:250px;height:60px;overflow:hidden;background-color:transparent;position:relative;border:1px solid rgb(128,128,128)'></iframe>"+
                                "<div style=\"padding:1em 0\">"+
                                  "Masthead Height:<br />"+
                                  "<input type=\"radio\" name=\"masthead_height\" "+(kustomizer.mastheadHeight == 275 ? "checked" : '')+" onclick=\"kustomizer.mastheadHeight=275;kustomizer.setMastheadHeight()\">Tall (275)"+
                                  "<input type=\"radio\" name=\"masthead_height\" "+(kustomizer.mastheadHeight == 200 ? "checked" : '')+" onclick=\"kustomizer.mastheadHeight=200;kustomizer.setMastheadHeight()\">Medium (200)"+
                                  "<input type=\"radio\" name=\"masthead_height\" "+(kustomizer.mastheadHeight == 125 ? "checked" : '')+" onclick=\"kustomizer.mastheadHeight=125;kustomizer.setMastheadHeight();\">Short (125)"+
                                "</div>"+
                                        "<div style=\"text-align:rightpadding-top:1em;\">"+
                                            "<input type=\"button\" onclick=\";kustomizer.clearImages()\" value=\"clear images\" >&nbsp"+
                                            "<input type=\"button\" onclick=\";kustomizer.save()\" value=\"save\" >"+
                                            "<input type=\"button\" onclick=\";kustomizer.revert();\" value=\"revert changes\" >"+
                                            "<a style=\"clear:both;display:block;color:blue;font-size:80%\" href=\""+ podomatic.serverPath+"/podcast/settings?z="+getRequestParameter('z')+"\">Choose a different theme</div>"
                                        "</div>"+
                                    "</div>"
                   kustomizer.updateSelectorIndicators();
                 //  kustomizer.togglepanel();
            }}


        // pull and insert header images
        //if (settings.length ==1 )
           // return;
        //kustomizer.imageSelections.background = settings[1]
        //kustomizer.imageSelections.banner     = settings[2]

    },
    /* effectively hides color brightness selectors to avoid interfering with selection*/
     hideColorSelector: function()
     {
        var colorSelect             = document.getElementById("colorSelect")
        colorSelect.style.left      = "-500px"
        colorSelect.style.top      = "-500px"
     },

     hideBrightSelector: function()
     {
        var colorSelect             = document.getElementById("brightSelect")
        colorSelect.style.left      = "-500px"
     },

    /*updateUI updates the selection displays on the palette */
        updateSelectorIndicators: function()
        {
        //update selectors
            var colorSelect             = document.getElementById("colorSelect")
            var brightSelect            = document.getElementById("brightSelect")
            if(colorSelect == null)
                return;
            colorSelect.style.left      = ((kustomizer.currentHSB[kustomizer._hue]/360) * colorSelect.offsetParent.offsetWidth-4) + "px"
            colorSelect.style.top       = ((1-(kustomizer.currentHSB[kustomizer._sat]/255)) * colorSelect.offsetParent.offsetHeight-4) + "px"
            brightSelect.style.left      = ((1-(kustomizer.currentHSB[kustomizer._bri]/255)) * brightSelect.offsetParent.offsetWidth-4) + "px"


         }   ,


    /* derives palette from seed rgb*/
        derivePalette: function(/*array*/ rgb, /*colorspace*/ type){
            //for debugging
            var conversionFunction ={
                "rgb":kustomizer.rgbToHsb,
                "hsb":function(val) {return val}
                };

            var palette = {}
            var black   = [0,0,0]
            var hsb_seed                = conversionFunction[type](rgb)
            palette.baseColor           = kustomizer.HSBtoRGB(hsb_seed)
            palette.accentColor         = kustomizer.HSBtoRGB(kustomizer.derive_accent(hsb_seed))
            palette.headerFontColor     = kustomizer.HSBtoRGB(kustomizer.derive_header_font(hsb_seed))
            palette.bodyFontColor       = kustomizer.blend(palette.headerFontColor,palette.baseColor,0.8)
            palette.panelColor          = kustomizer.blend(palette.headerFontColor,palette.baseColor,0.2)
            palette.linkFontColor       = kustomizer.HSBtoRGB(kustomizer.derive_link_font(hsb_seed))
            palette.panelHighColor      = kustomizer.blend(palette.panelColor,palette.linkFontColor,0.8)
            palette.deepShadowColor     = kustomizer.HSBtoRGB(kustomizer.derive_shadow(hsb_seed))
            palette.shadowColor         = kustomizer.blend(palette.deepShadowColor,palette.baseColor,0.5)

            palette.tabBase             = kustomizer.blend(palette.shadowColor,black,0.8)
            palette.tabHover            = palette.shadowColor
            palette.tabUp               = kustomizer.blend(palette.shadowColor, palette.baseColor ,0.8)
            palette.tabUpFont           = kustomizer.blend(palette.headerFontColor,[255,255,255],0.8)

            /* top tab tints*/


            kustomizer.currentHSB       = hsb_seed;
            kustomizer.basePaletteHSB   = hsb_seed;
            kustomizer.currentSaturation = hsb_seed[kustomizer._sat]
            kustomizer.currentRGB       = palette.baseColor
            palette.playImage           =  (hsb_seed[kustomizer._sat]+ hsb_seed[kustomizer._bri] < 100 ? "/images/play_glossy_reverse.png": "/images/play_glossy.png")
            kustomizer.updateSelectorIndicators();
            kustomizer.setPalette(palette)
            //kustomizer.overrideExistingStyles(palette)
            return palette
        },
        /*  this function assigns colors to styles-- most of my work today will
            attempt to bind the two together*/
        setPalette:     function(/*palette*/testPalette){
            if (typeof window.palette == "undefined")
            {
                window.palette = {
                    "accent": kustomizer.insertRule(".accent","background-color:rgb(0,0,0)"),
                    "header": kustomizer.insertRule(".header","color:rgb(0,0,0)"),
                    "header2": kustomizer.insertRule(".header2","color:rgb(0,0,0)"),
                    "h2": kustomizer.insertRule("H2","color:rgb(0,0,0);padding-bottom:0.2em;border-bottom:0.1ex solid black;"),
                    "h1": kustomizer.insertRule("H1","color:rgb(0,0,0)"),
                    "h4": kustomizer.insertRule("H4","color:rgb(0,0,0)"),
                    "p": kustomizer.insertRule("P","color:rgb(0,0,0);line-height:130%;"),
                    "datespan": kustomizer.insertRule("SPAN.date","color:rgb(0,0,0);line-height:130%;"),
                    "main":   kustomizer.insertRule(".main","background-color:rgb(0,0,0)"),
                    "copy":   kustomizer.insertRule(".copy","color:rgb(0,0,0)"),
                    "panel":   kustomizer.insertRule(".panel","background-color:rgb(0,0,0)"),
                    "link":   kustomizer.insertRule("A.link","color:rgb(0,0,0)"),
                    "linkhover":   kustomizer.insertRule("A:hover.link","color:rgb(0,0,0)"),
                    "shadow": kustomizer.insertRule(".shadow","border:1px solid black;background-color:rgb(0,0,0)"),
                    "deepshadow" : kustomizer.insertRule(".deepshadow","border:1px solid black;"),
                    "vignette-img-sm" :kustomizer.insertRule(".vignette-img-sm","border-color: black;"),
                    "search-tag":kustomizer.insertRule("A.search-tag","color: black;"),
                    "anchor":   kustomizer.insertRule("A","color: black;"),
                    "title":    kustomizer.insertRule("A.podcast-title","background-image:url(/images/play_glossy.png);border-top:1px solid black;"),
                    "titleHover": kustomizer.insertRule("A:hover.podcast-title","background-image:url(/images/play_glossy.png);border-top:1px solid black;"),                                        "anchorhover": kustomizer.insertRule("A:hover","color:black;"),
                    "vignette-td-content": kustomizer.insertRule(".vignette-td-content","color:rgb(0,0,0)"),
                    "li": kustomizer.insertRule("li","color:rgb(0,0,0)"),
                    "tab-header": kustomizer.insertRule(".new-header","border-color:rgb(0,0,0);background-color:rgb(0,0,0);"),
                    "square-hover": kustomizer.insertRule("A:hover.square-tabs","border-top-color:rgb(0,0,0);background-color:rgb(0,0,0);color:rgb(0,0,0)"),
                    "square-active": kustomizer.insertRule("A:active.square-tabs","border-top-color:rgb(0,0,0);background-color:rgb(0,0,0);color:rgb(0,0,0)"),
                    "square-link": kustomizer.insertRule("A:link.square-tabs","border-top-color:rgb(0,0,0);background-color:rgb(0,0,0);color:rgb(0,0,0)"),
                    "square-visit": kustomizer.insertRule("A.square-tabs","border-top-color:rgb(0,0,0);background-color:rgb(0,0,0);color:rgb(0,0,0)")
                     };
                document.domain = "podomatic.com"
             }
             /* tab colorizing */
             with (window.palette["tab-header"].style)
             {
                 backgroundColor = "rgb("+testPalette.tabBase+")";
                 borderLeftColor = "rgb("+testPalette.tabBase+")";
                 borderTopColor = "rgb("+testPalette.tabBase+")";
                 borderBottomColor = "rgb("+testPalette.tabBase+")";
                 borderRightColor = "rgb("+testPalette.tabBase+")";
             }


             with (window.palette["square-active"].style)
             {
                 backgroundColor = "rgb("+testPalette.tabUp+")";
                 borderLeftColor = "rgb("+testPalette.panelHighColor+")";
                 borderTopColor = "rgb("+testPalette.panelHighColor+")";
                 borderBottomColor = "rgb("+testPalette.panelHighColor+")";
                 borderRightColor = "rgb("+testPalette.panelHighColor+")";
                 color = "rgb("+testPalette.headerFontColor+")";
             }
             with (window.palette["square-link"].style)
             {
                 backgroundColor = "rgb("+testPalette.tabUp+")";
                 borderLeftColor = "rgb("+testPalette.panelHighColor+")";
                 borderTopColor = "rgb("+testPalette.panelHighColor+")";
                 borderBottomColor = "rgb("+testPalette.panelHighColor+")";
                 borderRightColor = "rgb("+testPalette.panelHighColor+")";
                 color = "rgb("+testPalette.headerFontColor+")";
             }
             with (window.palette["square-visit"].style)
             {
                 backgroundColor = "rgb("+testPalette.tabUp+")";
                 borderLeftColor = "rgb("+testPalette.panelHighColor+")";
                 borderTopColor = "rgb("+testPalette.panelHighColor+")";
                 borderBottomColor = "rgb("+testPalette.panelHighColor+")";
                 borderRightColor = "rgb("+testPalette.panelHighColor+")";
                 color = "rgb("+testPalette.headerFontColor+")";
             }
             with (window.palette["square-hover"].style)
             {
                 backgroundColor = "rgb("+testPalette.tabHover+")";
                 borderLeftColor = "rgb("+testPalette.panelHighColor+")";
                 borderTopColor = "rgb("+testPalette.panelHighColor+")";
                 borderBottomColor = "rgb("+testPalette.panelHighColor+")";
                 borderRightColor = "rgb("+testPalette.panelHighColor+")";
                 color = "rgb("+testPalette.tabUpFont+")";
             }


             with (window.palette.accent.style)
                backgroundColor = "rgb("+testPalette.accentColor+")";
             with (window.palette.li.style)
                color = "rgb("+testPalette.headerFontColor+")";


             with (window.palette.header.style)
                color = "rgb("+testPalette.headerFontColor+")";
             with (window.palette.header2.style)
                color = "rgb("+testPalette.headerFontColor+")";
             with (window.palette.h2.style)
                color = "rgb("+testPalette.headerFontColor+")";
              with (window.palette.h1.style)
                color = "rgb("+testPalette.headerFontColor+")";
              with (window.palette.h4.style)
                color = "rgb("+testPalette.headerFontColor+")";


             with (window.palette.main.style)
                backgroundColor = "rgb("+testPalette.baseColor+")";

             with (window.palette.datespan.style)
                color = "rgb("+testPalette.bodyFontColor+")";
             with (window.palette.p.style)
                color = "rgb("+testPalette.bodyFontColor+")";
             with (window.palette.copy.style)
                color = "rgb("+testPalette.bodyFontColor+")";
             with (window.palette["vignette-td-content"].style)
                color = "rgb("+testPalette.bodyFontColor+")"

             with (window.palette.link.style)
                color = "rgb("+kustomizer.blend(testPalette.linkFontColor,testPalette.baseColor,0.8)+")";
             with (window.palette.linkhover.style)
                color = "rgb("+testPalette.linkFontColor+")";

             with (window.palette.anchor.style)
                color = "rgb("+kustomizer.blend(testPalette.linkFontColor,testPalette.baseColor,0.8)+")";
             with (window.palette.anchorhover.style)
                color = "rgb("+testPalette.linkFontColor+")";

             with (window.palette.title.style)
             {
                borderLeftColor     = "rgb("+testPalette.panelColor+")";
                borderRightColor    = "rgb("+testPalette.panelColor +")";
                borderTopColor      = "rgb("+testPalette.panelColor +")";
                borderBottomColor   = "rgb("+testPalette.panelColor +")";
                backgroundColor     = "rgb("+testPalette.baseColor+")";
                if (typeof (window.palette.title.style.filter) == "undefined")
                {
                    window.palette.title.style.backgroundImage = "url("+testPalette.playImage+")";
                    window.palette.title.style.filter          = ""
                }
               else
                {
                    window.palette.title.style.backgroundImage = ""
                    window.palette.title.style.filter          = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+testPalette.playImage+"', sizingMethod='crop')";
                }

             }
             with (window.palette.titleHover.style)
             {
                borderLeftColor     = "rgb("+testPalette.panelHighColor+")";
                borderRightColor    = "rgb("+testPalette.panelHighColor +")";
                borderTopColor      = "rgb("+testPalette.panelHighColor +")";
                borderBottomColor   = "rgb("+testPalette.panelHighColor +")";
                backgroundColor     = "rgb("+kustomizer.blend(testPalette.baseColor,testPalette.accentColor,0.7) +")" ;
                if (typeof (window.palette.titleHover.style.filter) == "undefined")
                {
                    window.palette.titleHover.style.backgroundImage = "url("+testPalette.playImage+")";
                    window.palette.titleHover.style.filter          = ""
                }
               else
                {
                    window.palette.titleHover.style.backgroundImage = ""
                    window.palette.titleHover.style.filter          = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+testPalette.playImage+"', sizingMethod='crop')";
                }
             }

             with (window.palette.h2.style)
             {
                borderBottomColor   = "rgb("+testPalette.panelHighColor +")";
             }

             with (window.palette["search-tag"].style)
                color = "rgb("+kustomizer.blend(testPalette.linkFontColor,testPalette.bodyFontColor,0.7) +")" ;

            with (window.palette.panel.style)
                backgroundColor = "rgb("+testPalette.panelColor+")";

             with (window.palette.shadow.style)
             {
                borderLeftColor     = "rgb("+testPalette.shadowColor+")";
                borderRightColor    = "rgb("+testPalette.shadowColor +")";
                borderTopColor      = "rgb("+testPalette.shadowColor +")";
                borderBottomColor   = "rgb("+testPalette.shadowColor +")";
                backgroundColor     = "rgb("+testPalette.shadowColor +")";
             }

            with (window.palette.deepshadow.style)
            {
                borderLeftColor     = "rgb("+testPalette.deepShadowColor+")";
                borderRightColor    = "rgb("+testPalette.deepShadowColor +")";
                borderTopColor      = "rgb("+testPalette.deepShadowColor +")";
                borderBottomColor   = "rgb("+testPalette.deepShadowColor +")";
            }
            with (window.palette["vignette-img-sm"].style)
            {
                borderLeftColor     = "rgb("+testPalette.deepShadowColor+")";
                borderRightColor    = "rgb("+testPalette.deepShadowColor +")";
                borderTopColor      = "rgb("+testPalette.deepShadowColor +")";
                borderBottomColor   = "rgb("+testPalette.deepShadowColor +")";
            }


         },
         /* this method cruises through the dom and looks for current backgound,
         border, and color styles and then overrides them
            this is my colorizing rationale:
             body background-color is always the main color


         */

         overrideExistingStyles: function(/*palette*/testPalette){
            var tags         = ["HTML","BODY","TABLE","TD","DIV","SPAN","A"]
            var regExpRGB    = /rgb+\u0028+rgb+\u0028+/gi
            var regExpClose  = /\u0029{2}/gi
            var colorizedStyles = {
                "backgroundColor":"",
                "borderLeftColor":"",
                "borderTopColor":"",
                "borderRightColor":"",
                "borderBottomColor":"",
                "color":""
             }
           /* this private funciton flattens the styles for a given dom element*/
            function copyToStyle(/*dom element*/elem){
                //ie
                var rtnStr = elem.tagName + "\n"
               // alert(elem.tagName)
                if (elem.currentStyle){
                    for (styleProperty in colorizedStyles)
                        if (typeof(elem.style[styleProperty]) != "undefined" )
                        {
                            elem.style[styleProperty] = elem.currentStyle[styleProperty].toString();
                        }
                  //  alert(rtnStr)
                    return;
                }
                /*others*/
                 var cssStyles = getComputedStyle(elem,null);
                 if (typeof cssStyles == "undefined")return;
                 var rtnStr = ""
                 for (styleProperty in colorizedStyles){
                      if (typeof(elem.style[styleProperty]) != "undefined" ){
                            elem.style[styleProperty] = cssStyles.getPropertyValue(styleProperty);
                      }
                 }
                 return;
            }
            var copyFunction = function (){};
            //if (!kustomizer.isFlattened)
               //      copyFunction = copyToStyle;
             kustomizer.isFlattened = true
            //for each dom tag....
            // this performs a replacement in each style tag //
            for (var t =0;t < tags.length;t++)
            {
                //for each element's styles
                var tagSet = document.getElementsByTagName(tags[t])
                for (var el = 0; el < tagSet.length; el++)
                {
                    var rtnString    = ""
                    var regExpSpace  = /\s/gi
                    var count        = 0
                    var elem         = tagSet[el]
                    copyFunction(elem)
                    for (styleProperty in colorizedStyles){
                        var text = elem.style[styleProperty]
                        if (text.length > 0){
                            text = text.replace(regExpSpace,"")
                            for (color in colors){
                                for (var c  = 0;c< colors[color].length;c++){
                                    if (text.match(colors[color][c])!= null)
                                    {
                                        elem.style[styleProperty] = "rgb("+ testPalette[color] +")";
                                    }
                                }
                            }
                            rtnString                  += styleProperty +": "+elem.style[styleProperty]+ "\n"
                            count++
                        }
                   }
                //  alert(rtnString +"\n"+ count)
                }
            }
            var clrstr = "color: Oldcolor -> newColor: \n"
            for (color in colors)
            {
                clrstr += color + ": "+colors[color]
                colors[color].pop()
                colors[color].push(testPalette[color]);
                clrstr +=" -> "+colors[color]+ ":"+ testPalette[color]+"\n"
            }
            //alert(clrstr)
         },

    /* inserts a rule into the stylesheet*/
     insertRule: function(/*string*/selector,/*string*/ rule){
            var styleSheet = document.styleSheets[0]

            if (typeof (styleSheet.insertRule)!= "undefined")
            {
                  styleSheet.insertRule(selector + "{"+rule+"}",styleSheet.cssRules.length);
                  return styleSheet.cssRules[styleSheet.cssRules.length - 1]
            }
            styleSheet.addRule(selector, rule)
            return styleSheet.rules[styleSheet.rules.length - 1]
        },


    /*convert rgb values to hsb*/
    rgbToHsb: function(/*int array*/ rgb,/*float 0-1*/ desired_contrast ){
            //calculate contrast
            var r               = rgb[0]
            var g               = rgb[1]
            var b               = rgb[2]

            /* Make sure values are sane */
            if (r < 0) r = 0;
            if (g < 0) g = 0;
            if (b < 0) b = 0;

            // intensity range

            // contrast or saturation is the range
            var lowest_value    = Math.min(r,g,b)
            var highest_value   = Math.max(r,g,b)
            var contrast        = (highest_value - lowest_value)
            //brightness is the lowest value -- perhaps should be the avg
            var brightness      = (lowest_value)

            // convert rgb to relative percent
            var r               = (r - lowest_value)/contrast
            var g               = (g - lowest_value)/contrast
            var b               = (b - lowest_value)/contrast

            var hue = 0;
            if (r == 1)
                hue = 0 +g*60 -b*60;
            if (g == 1)
                hue = 120 +b*60 -r*60;
            if (b == 1)
                hue = 240 +r*60 -g*60;
            hue = kustomizer.changeHue(hue);
            return [hue, contrast/(255 - lowest_value)*255, brightness]
        },

    HSBtoRGB: function(/*array*/hsb){
            // first convert hue to discreet, full contrast rgb
            // divide hue into three sections
            var section = (hsb[kustomizer._hue]- hsb[kustomizer._hue]%60 )/60
            var pct     = ((hsb[kustomizer._hue]%60)/60)
            //alert("hsb[_hue]%60" +hsb[_hue]%60)
            //            [ red  , green  ,   blue ]
            var convert = [ [ 1       ,pct   ,0   ],
                          [ 1-pct     ,1     ,0   ],
                          [ 0         ,1     ,pct ],
                          [ 0         ,1-pct ,1   ],
                          [ pct       ,0     ,1   ],
                          [ 1         ,0     ,1-pct ]
                          ]
            var satRange = (255- hsb[kustomizer._bri]) * (hsb[kustomizer._sat]/255)
            // I'm losing precision here which I really need.
            var r       = Math.round(convert[section][0] * satRange + hsb[kustomizer._bri])
            var g       = Math.round(convert[section][1] * satRange + hsb[kustomizer._bri])
            var b       = Math.round(convert[section][2] * satRange + hsb[kustomizer._bri])
            //alert(pct + "hsb("+hsb+") = rgb("+[r,g,b]+")")
            return [r,g,b]
        },


    /* this funciton spins the hue appropriately*/
    changeHue: function(/*int*/ h){
            if (h > 359)
                return h%359;

            if (h < 0)
                return 359 - (Math.abs(h)%359)
            return h
        },
    /* not currently used*/
    changeBrightness: function(/*float */b){
            return Math.min(kustomizer.range,Math.max(0,b))
        },

    /* this function acts to rotate brightness to preserve contrast*/
    shiftBrightness: function(/*float */ v, /*float*/ shift){
            v = v + shift
            if (v > kustomizer.range)
                return v%kustomizer.range;
            if (v < 0)
                return kustomizer.range - (Math.abs(v)%kustomizer.range)
            return v
        },

    /* this function basically derives a high contrast hue
        of 180 degree bightness

        1-- spin hue between 150 - 210 degrees rnd +-
        */
    derive_accent: function(/*float array*/ hsb){
            var seed        = Math.random()
            var range       = kustomizer.range
            var h           = kustomizer.changeHue(hsb[kustomizer._hue] -60* ((hsb[kustomizer._sat]*hsb[kustomizer._sat])/(range*range)));
        /* I may use this for secondary color instead of accent*/
        //var b = changeBrightness(hsb[_bri] + (1- seed)*(100 - hsb[_sat]) )
            var s           = hsb[kustomizer._sat];
            var is_bright   = kustomizer.shiftHighlights(hsb[kustomizer._bri])
            var b           = kustomizer.shiftBrightness(hsb[kustomizer._bri], (255-hsb[kustomizer._bri])*0.3  -10 +(20* is_bright )  );
            return [h,s,b];
        },

    derive_link_font: function(/*float array*/ hsb){
        /* I may use this for secondary color instead of accent*/
        //var b = changeBrightness(hsb[_bri] + (1- seed)*(100 - hsb[_sat]) )
            var range = kustomizer.range
            var is_bright   = kustomizer.shiftHighlights(hsb[kustomizer._bri])
            var is_grey     = kustomizer.shiftGreys(hsb[kustomizer._bri])
            var cmy_comp    = kustomizer.compensateForYellow(hsb[kustomizer._hue],hsb[kustomizer._sat])*60
            var fix_hue     = hsb[kustomizer._hue] - cmy_comp
            var satpct      = hsb[kustomizer._sat]/255
            var grey_comp   = (is_grey >0.5?1: -1)*80
            var h           = kustomizer.changeHue((1-satpct) * 240 + satpct*fix_hue);//kustomizer.changeHue(240 - hsb[kustomizer._hue]* (1-kustomizer.compensateForYellow(hsb[kustomizer._hue],hsb[kustomizer._sat])));
            var s           = kustomizer.shiftBrightness(range, -255 * (satpct * hsb[kustomizer._bri]/255)+grey_comp);//compensateForYellow(hsb[_hue],hsb[_sat]
            var b           = (1-satpct) *kustomizer.shiftBrightness(128,  -grey_comp * is_bright ) //- cmy_comp);

            //var b = shiftBrightness(0, (-(hsb[_hue]+240)%255 + (255-hsb[_sat]/2) * hsb[_bri]) -128*compensateForYellow(hsb[_hue],hsb[_sat])  )//shiftBrightness(range, -(range -hsb[_sat]) );
            return [h,s,b];
        },


        /* this function basically derives a high contrast hue
        of 180 degree bightness

        1-- spin hue between 150 - 210 degrees rnd +-
        */
    derive_header_font: function(/*float array*/ hsb) {
        /* I may use this for secondary color instead of accent*/
        //var b = changeBrightness(hsb[_bri] + (1- seed)*(100 - hsb[_sat]) )
            var h = kustomizer.changeHue(hsb[kustomizer._hue]);
            var is_grey   = kustomizer.shiftGreys(hsb[kustomizer._sat])
            var is_bor    = kustomizer.shiftGreys(hsb[kustomizer._bri])
            var b_invert  = (Math.abs((60-(h%120))/60) < 0.5 ? false:true)
            var range = kustomizer.range
            var s = kustomizer.range-hsb[kustomizer._sat]- (is_bor > 0.3? is_bor: 0)*128//kustomizer.shiftBrightness(range,-hsb[kustomizer._sat]) //- hsb[_bri] ;
            var b = kustomizer.range-hsb[kustomizer._bri]- (is_grey > 0.2? is_grey: 0)*128
            // added to invert brightness
            if (b != 0)
                b = b/b;
           // alert(hsb[kustomizer._sat] +":"+ hsb[kustomizer._bri])
            if ((b_invert) &&(hsb[kustomizer._sat] > 190) && (hsb[kustomizer._bri] < 20))
                b = kustomizer.range - b; //+ -is_bright * 0.9 * kustomizer.shiftGreys(hsb[kustomizer._bri]))  ;
            if ((is_grey > 0.5) && (hsb[kustomizer._bri] < 64))
                b += (kustomizer.range- b)*is_grey ;
            b = kustomizer.changeBrightness(b);
            return [h,s,b];
        },

     derive_shadow: function(/*float array*/ hsb) {

        var h = hsb[kustomizer._hue]
        var s = kustomizer.changeBrightness(hsb[kustomizer._sat]*0.5)
        var b = kustomizer.changeBrightness(hsb[kustomizer._bri]*0.5)
        return [h,s,b];

        },


    /* blends two color values together using the given percentage*/
    blend: function(/*float array*/ source1,/*float array*/ source2, /*float 0-1*/pct) {
            var h = Math.round(source1[kustomizer._hue]*pct + source2[kustomizer._hue]*(1-pct));
            var s = Math.round(source1[kustomizer._sat]*pct + source2[kustomizer._sat]*(1-pct)); //- hsb[_bri] ;
            var b = Math.round(source1[kustomizer._bri]*pct + source2[kustomizer._bri]*(1-pct));
            return [h,s,b];
        },

    /* this functions shifts color off of greys to avoid low contrast situations*/
    shiftGreys: function(/*float*/brightness){
            var neutral     = 128
            var deviation   = Math.min(2*neutral,Math.max(brightness,0))
            deviation       = (neutral - Math.abs(neutral-deviation))/neutral
            return deviation
        },

       /* this functions shifts color off of greys to avoid low contrast situations*/
    shiftHighlights: function(/*float*/brightness){
            var whites      = 64
            var deviation   = brightness - 255 + whites
            if (deviation > 0)
                return -1
            return 1
        },

    /* this method looks at the deviation from cyan magenta and yellow
        --  in an hsb model 60 degrees represents the range of effect of a specific
            color
        the reason I check for this is because cyan,magenta and yellow have much
        higher percieved brightenss and intensity
            */
   /* corrects accordingly*/
    compensateForYellow: function(hue,sat){

            var range           = 255;
            var hue_importance  =(60-(hue%120))/60
            var sign            = (hue_importance <0? -1:+1)
            var sat_importance  = sat/range
            var deviation       = (1-Math.abs(hue_importance)) * sat_importance * sign
            return deviation
       },

    basePaletteHSB:     [128,128,128],
    currentSaturation:  null,
    brightSample:       false,
    colorSample:        false,
    sampleColor:        function (event){},

    sampleBrightness: function(event){
        //if (!kustomizer.brightSample)
        //    return;
        targetEl            = (typeof event.target == "undefined"?event.srcElement:event.target)
        var brightness      = 1-(event.clientX - this.getXOffset(targetEl))/targetEl.offsetWidth

        //if (brightness < 0.5)
        //    kustomizer.basePaletteHSB[1]   = kustomizer.currentSaturation * brightness*2;
        kustomizer.basePaletteHSB[2]       = kustomizer.range * brightness

        kustomizer.derivePalette( kustomizer.basePaletteHSB, "hsb")
        document.getElementById("colorbars").style.backgroundColor= "rgb("+  [ Math.round(255* brightness),Math.round(255* brightness),Math.round(255* brightness)] + ")";
    },

    sampleColor: function(event){
        //if (!kustomizer.colorSample)
        //    return;
        var targetEl        = (typeof event.target == "undefined"?event.srcElement:event.target)
        var hue         = (event.clientX - kustomizer.getXOffset(targetEl))/targetEl.offsetWidth * 360

        var saturation  = 1-(event.clientY - kustomizer.getYOffset(targetEl))/targetEl.offsetHeight
        kustomizer.basePaletteHSB[0] = hue
        kustomizer.basePaletteHSB[1] = 255*saturation
        kustomizer.currentSaturation = 255* saturation
        kustomizer.derivePalette( kustomizer.basePaletteHSB, "hsb")
    },

    startColorSample:   function(){kustomizer.colorSample = true;},
    endColorSample:     function(){kustomizer.colorSample = false;},


    startBrightnessSample:  function(){ kustomizer.brightSample = true;},
    endBrightnessSample:    function(){ kustomizer.brightSample = false;},
    getXOffset:             function (el){

            if (el == null ) return 0;
            return (el.offsetLeft + kustomizer.getXOffset(el.offsetParent))
        },
    getYOffset:             function(el){
        if (el == null ) return 0;

        var foo =  (el.offsetTop + kustomizer.getYOffset(el.offsetParent))
        return foo
        },


    /*image handling methods and variables.*/

    imageSelectors:     null,
    imageSelections:    { background:"",
                           banner:""},
   /* this method will clear the image array */
   clearImages: function(){
        for (image in kustomizer.images)
        {
           var imgEl =  document.getElementById(image)
           if(imgEl != null)
           {

                // only use alphaImage if absolutely necessary
                if((typeof (imgEl.style.filter) !="undefined") && (kustomizer.images[image].match("png") != null))
                    imgEl.style.filter          = "";
                else
                    imgEl.style.backgroundImage= "none"

            }
        }
        kustomizer.images = {}

   },
   /* this method sets the height of the masthead  */
  setMastheadHeight: function() {
                       document.getElementById('pagehead').style['height']=kustomizer.mastheadHeight + "px";
                     },

   /* this method will load and display the header and background images.
      really just the header for now...
   */
    renderImages:       function(){
        for (image in kustomizer.images)
        {
           var imgEl =  document.getElementById(image)
           if(imgEl != null)
           {

                // only use alphaImage if absolutely necessary
                if((typeof (imgEl.style.filter) !="undefined") && (kustomizer.images[image].match("png") != null))
                    imgEl.style.filter          = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+kustomizer.images[image]+"', sizingMethod='crop')";
                else
                    imgEl.style.backgroundImage= "url("+kustomizer.images[image]+")";
            }
        }
    },



    renderImageBrowser: function()
    {

        var script      = document.createElement('script');
            script.type = 'text/javascript';
            script.src  = podomatic.serverPath +"/mymedia/library_images?"+new Date().getTime() ;
            document.body.appendChild(script);


    },

    findImageTarget: function(el){
        if (el.tagName == "BODY")
            return el
        attr    = el.getAttribute("ImageDrop");
        return (attr == null? kustomizer.findImageTarget(el.parentNode):el)

    },
    currentTarget:      null,
    dragToCanvas: function(event){
        var targetEl        = (typeof event.target == "undefined"?event.srcElement:event.target);
        if(targetEl.getAttribute("src") == null)
            return;
        kustomizer.dragInProgress   = true
        kustomizer.selectedImage    = { src:targetEl.getAttribute("rawimage")}
        kustomizer.getDragImage(targetEl.getAttribute("src"))
        kustomizer.mousemove(event);

        if (typeof(event.cancelBubble) != "undefined")
        {
            event.cancelBubble = true;
            return
        }

        event.stopPropagation();
        event.preventDefault();

    },

    /* unstyles the old targetEl*/
    releaseHighlight:   function(targetEl){
        if (kustomizer.currentTarget == null)
            return;
        if (targetEl != null)
            if(targetEl.id == kustomizer.currentTarget.id)
                return;
        kustomizer.currentTarget.style.backgroundColor  = kustomizer.currentTarget.getAttribute("oldBorder")
        kustomizer.currentTarget = null
    },
    mouseenter: function (event)
    {
        kustomizer.mousemove(event)
    },
    mousemove:          function(event){
        var setHighlight = function(targetEl)
        {
            if(kustomizer.currentTarget != null)
                if (targetEl.id == kustomizer.currentTarget.id)
                    return;

            if(targetEl.getAttribute("imageDrop")== null)
                return;

            kustomizer.currentTarget                = targetEl
            kustomizer.currentTarget.setAttribute("oldBorder",kustomizer.currentTarget.style.backgroundColor);
            kustomizer.currentTarget.style.backgroundColor  = "rgb(255,255,0)"
            ;
        }

        if (kustomizer.dragInProgress == true)
        {
            //update dragIcon position
            var x = (typeof(event.clientX)!= "undefined"? event.clientX:event.pageX)
            var y = (typeof(event.clientY)!= "undefined"? event.clientY:event.pageY)

            kustomizer.dragImage.style.left = (x -kustomizer.dragImage.offsetWidth -20) + "px"
            kustomizer.dragImage.style.top = (y -kustomizer.dragImage.offsetHeight -20) + "px"
            //highlight unhighlight targets
            var tel             = (typeof(event.srcElement) == "undefined"?event.target:event.srcElement)
            var targetEl        = kustomizer.findImageTarget(tel);
            kustomizer.releaseHighlight(targetEl);
            setHighlight(targetEl);
        }
        if (typeof(event.cancelBubble) != "undefined")
        {
            event.cancelBubble = true;
            event.returnValue = false;
            return
        }
        event.stopPropagation();
        event.preventDefault();

    },

    mouseup: function(event)
    {

        if (kustomizer.dragInProgress == true)
        {
            //hide dragfun
            kustomizer.dragInProgress = false
            kustomizer.dragImage.style.display      = "none";
            if (kustomizer.currentTarget != null)
            {
                kustomizer.currentTarget.style.backgroundColor  = kustomizer.currentTarget.getAttribute("oldBorder")
                kustomizer.currentTarget = null
            }
            var targetEl        = kustomizer.findImageTarget((typeof event.target == "undefined"?event.srcElement:event.target));
            if (targetEl == null)
                return;
            if ((targetEl.getAttribute("imageDrop")!= null))
            {
                var img = kustomizer.selectedImage
                targetEl.style.backgroundImage = "url("+img.src+")";
                kustomizer.images[targetEl.id] = img.src;

                //targetEl.style.backgroundImage = "url("+podomatic.serverPath+"/media/listen/"+img.src+")";
               // kustomizer.images[targetEl.id] = podomatic.serverPath+"/media/listen/"+img.src;


            }
        if (typeof(event.cancelBubble) != "undefined")
        {
            event.cancelBubble = true;
            event.returnValue = false;
            return
        }
        event.stopPropagation();
        event.preventDefault();
        }



    },

    /* returns an "icon" of the image on the palette for drag and drop.*/
    dragInProgress: false,
    dragImage:      null,
    selectedImage:  null,
    getDragImage:   function(/*path for targetimage */ sourceImagePath)
    {
        /* create if none instantiated */
        if (kustomizer.dragImage  == null)
        {
            var img                 = document.createElement('img');
            var div                 = document.createElement('div');
            img.style.border        = "1px solid rgb(0,0,0)";
            div.style.border        = "1px solid rgb(255,255,255)";
            div.style.position      = "absolute";
            div.style.top           = "100px";
            div.style.left          = "100px";
            div.style.height        = "auto";
            div.style.width         = "auto";
            document.body.appendChild(div);
            div.style.zIndex        = "14000";
            div.appendChild(img);
            div.id                  = "kustomizer.dragImage";
            kustomizer.dragImage    = div;
        }
        kustomizer.dragImage.style.display      = "block";
        kustomizer.dragImage.firstChild.src = sourceImagePath;
        return kustomizer.dragImage;
    },



    /**************************************************************************
    DEFERRED IMAGE LOADING
    this is a page performance feaure that defers loading of page images until
    a page is customized
    **************************************************************************/
    loadImages: function ()
    {
        var casts   = document.getElementById("maincolumn")
        if (casts == null) { return; }

        images      = casts.getElementsByTagName("IMG")
        for (var i=0; i< images.length; i++)
        {
            var isrc = images[i].getAttribute("isrc")
                if (isrc != null)
                    images[i].src = isrc
        }

    }












   }
    /* unit test method to read and assign*/
    function testPalette(arr)
    {
        var testPalette = kustomizer.derivePalette(arr,"rgb")
        var feedback    = ""
        if (typeof window.palette == "undefined")
            window.palette = {
            "accent": kustomizer.insertRule(".accent","background-color:rgb(0,0,0)"),
            "header": kustomizer.insertRule(".header","color:rgb(0,0,0)"),
            "main":   kustomizer.insertRule(".main","background-color:rgb(0,0,0)"),
            "copy":   kustomizer.insertRule(".copy","color:rgb(0,0,0)"),
            "link":   kustomizer.insertRule(".link","color:rgb(0,0,0)")
            };

        with (palette.accent.style)
        {
            backgroundColor = "rgb("+testPalette.accentColor+")"
        }
        with (palette.header.style)
            color = "rgb("+testPalette.headerFontColor+")";

         with (palette.main.style)
            backgroundColor = "rgb("+testPalette.baseColor+")";

         with (palette.copy.style)
            color = "rgb("+testPalette.bodyFontColor+")";

        with (palette.link.style)
            color = "rgb("+testPalette.linkFontColor+")";
    }
   // podomatic.init.add(kustomizer.init);
    podomatic.init.add(kustomizer.setMastheadHeight);
    podomatic.init.add(kustomizer.renderImages);
    podomatic.init.add(kustomizer.loadImages);








