if (dojo.version.flag !== "macuk") {
    dojo.registerModulePath("site","/js/v1/site");
}

dojo.require("generic.img");
dojo.require("site.cart");
dojo.require("generic._base");
dojo.require("generic.flashx");
dojo.require("site.popupMessage"); // utility nav

// footer
dojo.require("site.bottomFixed");
dojo.require("generic.menu");

var cartStatus = {};
var global = {
    // cartHandler:
    // handles calls to/from cart
    // handles status of cart (ex: cart popup in global nav)
    cartHandler: new site.cart(),
    
    playerversion: null // uses default in flash api
};

// set global flash version
if (navigator.userAgent.indexOf("Macintosh") != -1) {
    global.playerversion = "10.0.0";
}
 

// js to run when page elements have loaded
dojo.addOnLoad( function() {

    // get/set height of page elements
    heightHandler.init();

    // global nav cart status
    cartStatus.init();

    // utility nav in global nav
    utilitynav.init();

    // footer
    if (dojo.isIE == 6) {
        var footer = new site.bottomFixed({
            node: dojo.byId("footernav")
        });
    }
    var utilityNavBottom = new site.bottomFixed({
        node: dojo.byId("utilitynav"),
        minTop: 480
    });
    // country chooser drop-up
    var footerMenu = new generic.menu({
        menu: "countries_container",
        target: "countries_hd"
    });
    
    // Add rollover to every image w/ class "rollover"
    dojo.query("img.rollover").forEach(
        function(elem) {
            var rollover = new generic.rollover(elem, null);
        }
    );

    // multiple instances of live chat popup buttons
    initLiveChatPopup("gnav_popup_live_chat");
    initLiveChatPopup("popup_live_chat");
    initLiveChatPopup("popup_live_chat_2"); // if mult links on same page

});



/**** classes & functions ****/

/*
 * cartStatus:
 * global cart status
 */
cartStatus = {

    // doCartRefresh: Boolean
    // Do a refresh of cart the next time the panel displays
    doCartRefresh: false,
    
    init: function() {
        this.countNode = dojo.byId("global_cart_count");
        this.cartHandler = global.cartHandler;
        
        // start with initial count
        this.updateCount();
        var countContainer = dojo.byId("shopping_bag_items");
        if (countContainer) {
            dojo.removeClass(countContainer, "hidden");
        } else {
            return;
        }
        var self = this;
        
        dojo.subscribe("/page/cart/alterCart", this, function(args) {
            self.onAlterCart(args);
        });
    },
    
    onAlterCart: function(args) {        
        // update count in left nav on any action
        this.updateCount();
        
        // when cart has been added to, flag it for a refresh
        // (qty & remove already trigger refresh directly from cart handlers)
        if (args.action === "add" && args.cartType === "checkout") {
            this.doCartRefresh = true;
            if (dojo.global.mymacNav) {
                dojo.global.mymacNav.handlePanelRefresh({event: "alter_cart"});
            }
        }    
    },
    
    updateCount: function() {
        if (this.countNode) {
            var itemCount = this.cartHandler.getItemCount();
            this.countNode.innerHTML = itemCount;
        }
    }
    
};

/*
 * heightHandler:
 * manage height changes for/caused by absolutely positioned elements
 */
heightHandler = { 
    pagetype: null,
    min: 620,
    winh: 0, // re-saved everytime window height changes
    bodyh: 0,
    bodyhOriginal: 0, // onload is saved as original height of body
    bodyhWithoutPanel: 0, // current body height w/out additional height of sliding panel
    offset: 0, // height as offset by footer
    isCMS: false,
    spacer: null, // node to resize to affect body height
    excludeOnResize: [ "color_play" ], // has no color bar to reset height to & contains it's own resize functions
    excludeOnload: [ "color_play", "locator" ],
    isLoading: false,
    isResizing: false,
    timer: null,
    isIE6: false,
    hasCMSLayers:false,
    
    init: function() {
        this.hasCMSLayers = (dojo.query(".cms_layer","main_content_td").length>0); 
        if (this.hasCMSLayers) this.cmsCleanup(); 
        
        // ignore pages that don't have the global nav
        var gnav = dojo.byId("globalnav_container");
        if (!gnav) { return; }
        var spacer = dojo.byId("column_spacer");        
        if (dojo.isIE == 6) {
            this.isIE6 = true;
            var colorNav = dojo.byId("color_nav_td");
            spacer = (colorNav ? colorNav : spacer); // if no color nav, then don't have to set its height 
        }
        this.spacer = spacer;
        
        this.setPageType();
            
        // get offset for footer
        var fnnode = dojo.byId("footernav");
        this.offset = (fnnode ? fnnode.offsetHeight : this.offset);        
        
        // ensure that winh doesn't result in negative value later
        this.winh = this.getWindowHeight();
        if (this.winh <= this.offset) {
            this.winh = (this.offset * 2);
        }
        
        if (this.pagetype !== "home") {
            //this.bodyhOriginal = (this.isCMS ? this.getCMSHeight() : this.getBodyHeight());
            this.bodyhOriginal = this.getBodyHeight(); 
            this.bodyh = this.bodyhOriginal; 
        }
        
        this.onLoad(); 
        
        // set up handlers:
        // event: show panel or accordion containing content that has already loaded
        dojo.subscribe("/panelnav/event/show", this, function(args) {
            var navHasLoaded = (args.type === "accordion" ? true : false); // check for panel state where content has not loaded yet
            if (!navHasLoaded) {
                try {
                    navHasLoaded = dijit.byId(args.subId).hasLoaded;
                } catch (err) {}
            }
            if (navHasLoaded) {
                this.onPanel("show", args);
            }
        });
        // event: initial load of psubnav content
        dojo.subscribe("/globalnav/event/getcontent/onload", this, function(args) {
            // get parent panel of loaded psubnav
            try {
                args.id = dijit.byId(args.parentId).panelId;
            } catch (err) {}
            if (args.id) {
                this.onPanel("show", args);
            }
        }); 
        // event: hide panel
        dojo.subscribe("/panelnav/event/hide", this, function(args) {
            this.onPanel("hide", args);
        });

        if (dojo.indexOf(this.excludeOnResize, this.pagetype) == -1) {
            dojo.connect(window, "onresize", this, "onResize");
        }  
        
        this.isLoading = false;        
    },
     
    cmsCleanup: function() { 
        var cmsBlocks = [];
        dojo.forEach(dojo.query(".cms_layer","main_content_td"),function($_) { pushNew(cmsBlocks,$_.parentNode);});
        dojo.forEach(cmsBlocks,function($_) {if (!dojo.hasClass($_,"noCMSCleanup")) parseCMSLayers($_);});
        
        function parseCMSLayers(parentDiv) { 
            var moved = false; 
            if (dojo.hasClass(parentDiv,"hidden")) {  
                moved = true;
                parentDiv.origLeft = parentDiv.style.left;  
                parentDiv.style.left = "-5000px";
                dojo.removeClass(parentDiv,"hidden");
            }
            var input = dojo.query(".cms_layer", parentDiv);
               
            try {
                 var output = input.sort(function(a,b){return parseInt(a.style.top) - parseInt(b.style.top)}); 
            } catch(e) {  //dojo.query+array builtin methods, appears in FF3.5, Safari 4 
                 var newInput = [];
                 for (var i=0;i<input.length;i++) { 
                    newInput.push(input[i]);
                 } 
                 try {
                    var output = newInput.sort(function(a,b){return parseInt(a.style.top) - parseInt(b.style.top)});  
                 } catch(e) {
                  
                 }
            }
            if (!output) {
                   console.log("parseCMSLayers: output is null");
                   return;
            } 
    
            var outputRows = [];
            var outputFinal = [];
            outputRows[0] = [];
            var oIndex = 0;
            var previousTop = 0;
    
            for (var i=0;i<output.length;i++) { 
                output[i].style.height = "auto";  
                output[i].cmsTop = parseInt(output[i].style.top); 
                output[i].actualHeight = parseInt(output[i].clientHeight);   
                output[i].impliedTopMargin = (i==0) ? output[i].cmsTop : output[i].cmsTop - output[i-1].cmsTop - output[i-1].actualHeight; 
                //console.log(output[i].id + " " + output[i].actualHeight);
                previousTop = (i==0) ? output[i].style.top : output[i-1].style.top;
                
                if (output[i].style.top==previousTop) {//same row
                     
                } else {//next row
                    outputRows[oIndex] = outputRows[oIndex].sort(function(a,b){return  parseInt(a.style.left) -  parseInt(b.style.left)});    
                    oIndex++; 
                    outputRows[oIndex] = [];
                }
                outputRows[oIndex].push(output[i]);
            }
            outputRows[oIndex] = outputRows[oIndex].sort(function(a,b){return  parseInt(a.style.left) -  parseInt(b.style.left)}); 
 
            //parentDiv.innerHTML = "";
            var o = {}; var css = ""; 
            var adjust = (parentDiv.id == "main_content_td" ) ? 476 : 0;
            for (var i=0;i<outputRows.length;i++) { 
                for (var j=0;j<outputRows[i].length;j++) { 
                    o = outputRows[i][j]; 
                    css = "position:relative;"
                    css += "width:" + o.style.width + ";";  
                    css += "height:" + o.actualHeight + "px;";
                    css += "margin-left:" + (parseInt(o.style.left)-adjust) + "px;";
                    css += "margin-top:" + o.impliedTopMargin + "px;"; 
                    o.style.cssText = css;  
                    parentDiv.appendChild(o);
                } 
            }   
 
            if (moved) { 
                dojo.addClass(parentDiv,"hidden");
                parentDiv.style.left = parentDiv.origLeft; 
            }  
        }
    
        function pushNew(arr,o) {  
            var n = true;
            for (var i=0;i<arr.length;i++) {
                if (arr[i]==o) {n = false;break;}
            }
            if (n) arr.push(o);   
        }      
       
        //temp
        //document.body.style.height =  (dojo.byId("main_table").scrollHeight + dojo.byId("footernav").clientHeight + 50) +  "px"; 
        try {
            var colorNav = (dojo.isSafari) ? dojo.byId("color_nav_standalone") : dojo.byId("color_nav");  
            colorNav.style.height = (dojo.byId("main_table").scrollHeight + dojo.byId("footernav").clientHeight + 50) +  "px"; 
        } catch(e) {}
    },

    onLoad: function() {
        if (dojo.indexOf(this.excludeOnload, this.pagetype) > -1) {
            if (!this.isIE6) {
                return;
            } else if (!dojo.byId("color_nav_container")) {
                return;
            }
        }
        this.isLoading = true;        
        var h = (this.winh > this.min) ? this.winh : this.min; 
        var spacer = this.spacer;
  
        // home page: set height of spacer column to match window
        if (this.pagetype === "home") {  
            h = (this.winh - this.offset);
            this.spacer = spacer = dojo.byId("main_content");
            spacer.style.height = h + "px";
            
        // default: for sub pages
        } else {  
       
            // if body is shorter than window, set height to match window
            if (!this.hasCMSLayers && (h >= this.bodyh)) {    
                //console.log("body shorter than window");
                spacer.style.height = h + "px";  
                
      // cms content or IE6: cases where taller body requires explicitly setting spacer height. (cms body height is ignored by page & ie6 color bar height has to be set explicitly 
            //} else if (this.isCMS || this.isIE6) {   
            
            //cms content handled by CMSCleanup
            } if (this.isIE6) {
                var colorNav = (dojo.isSafari) ? dojo.byId("color_nav_standalone") : dojo.byId("color_nav");  
                if (colorNav) { 
                    var maxh = (2800 > this.bodyh) ? 2800 : this.bodyh;
                    if (dojo.isIE) { 
                        colorNav.style.height = this.bodyh + "px";  
                    } 
                    else if (dojo.isSafari) {  
                        colorNav.style.height = maxh + "px";   
                    }
                else {   
                        setTimeout(function(){colorNav.style.height=maxh+"px";}, 2000); 
                    } 
                }  
                       
                spacer.style.height = this.bodyh + "px"; 
                //console.log("CMS/IE6 page spacer h = "+spacer.style.height+" real h = "+spacer.offsetHeight);
            
            // for flash browsers, set spacer height to at least window initially, since flash could resize itself to shorter than window w/out triggering the resize event
            } else if (this.pagetype === "flash_browser") {
                spacer.style.height = h + "px";
            }
        }

        this.bodyhOriginal = this.bodyh = this.bodyhWithoutPanel = h;
    },
    
    setPageType: function() {
        var pd = dojo.global.page_data;
        if (this.pagetype) { 
            type = this.pagetype;
        } else {
            try {
                this.pagetype = pd.panel_nav["default"].id;
            }
            catch (err) { }
        }
        this.isCMS = (pd ? pd.cms_generated : null);
    },

    onPanel: function(action, args) {
        if (this.isResizing) { return; }
        var type = args.type;
        var parentId = args.parentId;
        // ignore gnav accordion
        if (parentId === "globalnav_container" && type === "accordion") {
            return;
        }
              
        var spacer = this.spacer;
        var id = args.id;
        if (type === "panel") {
            this.activePanelId = id;
        }
        var panelId = this.activePanelId;
                
        var panel = dojo.byId(panelId);
        if (!panel) { return; } // ex: open panels
        this.isResizing = true; // set isResizing after all non-returnable conditions met
        var self = this;
                
//console.log("event: "+action+", id = "+id+" panel to check = "+panelId+" type = "+type+" panel node = "+panel+" parent id = "+parentId);
    
        // wait for animation to finish
        var pause = function() {
            if (action === "hide" && type === "panel") {
                var h = self.bodyhWithoutPanel;
                // compare pre-panel open body height against window height
                if (h < self.winh) {
                    h = self.winh;
                }
                spacer.style.height = h + "px";
                self.bodyh = h;
            } else if (action === "show") {
                var panelh = panel.offsetHeight;
                // compare against window & last known body height
                // (getting current body height here not consistent across browsers)
                if (panelh > self.winh && panelh > self.bodyh) {
                    spacer.style.height = panelh + "px";
                    self.bodyh = panelh;
                }           
            }
            self.isResizing = false;
        }
        setTimeout(pause, 600); // note: should be equal to or greater than duration of open/close Panel sliding       
    },
    
    onResize: function() {
        if ((this.isResizing || this.isLoading) && !this.isIE6) { return; }
        var winh = this.getWindowHeight();
        var bodyh = this.bodyh;        
        var page = this.pagetype;
        if (winh > bodyh) {  
            this.doResize(page, winh);
        } else if (page === "home") { // page is home & winh is less than bodyh
            if ((winh < this.min) && (this.min > bodyh)) { 
                this.doResize(page, this.min);
            }
            
        // workaround for IE6: when contents in main body change dynamically (ex: elements load/display after page load), then we have to get/set height again
        } else if (this.isIE6) {            
            bodyh = this.getBodyHeight();
            if (bodyh != this.bodyh) {
                this.doResize(page, bodyh);
                this.bodyh = bodyh;
            }
        }
        this.winh = winh;
    },
    
    doResize: function(page, elementh) {
        var timer = this.timer;
        var spacer = this.spacer;
        var offset = this.offset;
        var h = elementh;
        var self = this;
        var resize = function() {
            if (page === "home") { h = (elementh - offset); }
            spacer.style.height = h + "px";
            self.bodyh = self.bodyhWithoutPanel = h;
        };      
    
        // avoid IE resize recursion
        if (dojo.isIE) {
            if (timer) clearTimeout(timer);
            timer = setTimeout(resize, 300);
        } else {
            resize();
        }     
    },
    
    getBodyHeight: function() {
        var h = dojo.body().scrollHeight; 
        return h;
    },
    
    getWindowHeight: function() {
        var h;
        if (typeof window.innerHeight !== 'undefined') {
            h = window.innerHeight;
        } else {
            h = document.documentElement.clientHeight;
        }
        return h;
    },
    
    getCMSHeight: function() {
        var h = 0;
        var nodes = dojo.query(".cms_layer", "#main_content_td");
        if (nodes.length==0) { return 800 }; /** cms_generated flag inaccurately set **/
        var last = nodes[nodes.length - 1];   
        //var lasth = parseInt(last.style.height);       
        last.style.height = "auto"; //in case it is misset by cms
        var lasth = parseInt(last.clientHeight); 
        var lastt = parseInt(last.style.top); 
        h = (lasth + lastt + 40); // add 40 slop
        return h;
    }
    
};

// utility Nav
var utilitynav = {
    
    formelements: {},    
    buttonsets: {},
    
    init: function() {
        
        // button/form toggling
        
        var ns = dojo.query(".utilitynav_button", "utilitynav");
        var self = this;
        
        dojo.forEach(ns, function(node) {
            // button/form pair toggling relies on naming convention: utilitynav_[button or form]_[pair name]
            var name = node.id.replace(/utilitynav_button_/g, "");
            var formnode = dojo.byId("utilitynav_form_" + name);
            
            // get form element id's being used (not all locale's may have same elements)
            var ftext = dojo.query("input[type=text]", formnode);
            var fsubmit = dojo.query("input[type=image]", formnode);
            var fieldnode = ftext[0];
            var fieldsubmit = fsubmit[0];
                        
            if (name && formnode && fieldnode) {
                self.buttonsets[node.id] = name;
                self.buttonsets[fieldnode.id] = name;
                self.buttonsets[fieldsubmit.id] = name;
                
                self.formelements[name] = { field: fieldnode.id, submit: fieldsubmit.id };
                dojo.connect(node, 'onclick', self, "showForm");
                dojo.connect(fieldnode, 'onblur', self, "showButton");
                fieldsubmit.isfocused = false;
                fieldsubmit.onfocus = function() { this.isfocused = true; }
                dojo.connect(fieldsubmit, 'onblur', self, "showButton");
            }
        });
              
        // form submits
        if (this.formelements.email) {
            var email_submit = dojo.byId(this.formelements.email.submit);
            var email_field = dojo.byId(this.formelements.email.field);
        }
        if (this.formelements.locator) {
            var locator_submit = dojo.byId(this.formelements.locator.submit);
        }
        
        if (email_submit && email_field) {
            dojo.connect(email_submit, 'onclick', this, "validateEmail");
            //dojo.connect(email_field, "onkeypress", this, "validateEmail");
        }
        if (locator_submit) {
            dojo.connect(locator_submit, 'onclick', this, "validateLocator");
        }

    },

    showForm: function(e) {
        var shownode, hidenode;
        var target = e.currentTarget;
        var hidenode = target;
        var name = this.buttonsets[target.id];
        var shownode = dojo.byId("utilitynav_form_" + name);
        this.toggle(hidenode, shownode);
        
        // focus on field
        var focusnode = (this.formelements[name] ? dojo.byId(this.formelements[name].field) : null);
        if (!focusnode) { return; }
        focusnode.focus();
        focusnode.value = "";
        focusnode.isfocused = true;
    },

    showButton: function(e) {
        var shownode, hidenode;
        var target = e.currentTarget;
        target.isfocused = false;
        var name = this.buttonsets[target.id];
        var self = this;
        var submitbtn = dojo.byId(this.formelements[name].submit);
        var field = dojo.byId(this.formelements[name].field);

        // wait for animation to finish
        var pause = function() {
            if (!submitbtn.isfocused && !field.isfocused) {
                var hidenode = dojo.byId("utilitynav_form_" + name);
                var shownode = dojo.byId("utilitynav_button_" + name);
                self.toggle(hidenode, shownode);           
            }
        }
        setTimeout(pause, 200);
    },
    
    toggle: function(hidenode, shownode) {
        if (hidenode && shownode) {
            hidenode.style.display = "none";
            shownode.style.display = "block";
        }
    },
    
    validateEmail: function(e) {
        var email_field = dojo.byId(this.formelements.email.field);
        dojo.require("dojox.validate.web");
        var popup;
        if ( e.type === "keypress" && (e.keyCode != dojo.keys.ENTER) ) {
            return false;           
        }
        if (dojox.validate.isEmailAddress(email_field.value)) {
            popup = new site.popupMessage({    
                popup: dojo.byId("pop_email_valid"),
                buttonClose: dojo.byId("pop_close_valid"),
                displayDuration: 5000
            });
            dojo.require("generic.jsonrpc");
            var requestArgs = [{
                EMAIL_ADDRESS: email_field.value,
                SEND_CONFIRM_EMAIL: 1
            }];
            var request = new generic.jsonrpc();
            var d = request.callRemote('Customer.emailListSignup', requestArgs);
        } else {
            popup = new site.popupMessage({    
                popup: dojo.byId("pop_email_invalid"),
                buttonClose: dojo.byId("pop_close_invalid"),
                displayDuration: 5000
            });
        }
        popup.show();
        dojo.stopEvent(e);
        return false;    
    },
    
    validateLocator: function(e) {
        var address = dojo.byId(this.formelements.locator.field);
        if(!address.value) {
            var popup = new site.popupMessage({    
                popup: dojo.byId("pop_location_invalid"),
                buttonClose: dojo.byId("pop_close_location"),
                displayDuration: 5000
            });
            popup.show();
            dojo.stopEvent(e);
            return false;
        } 
    }
}

// color bar strip flash
var colorNav = { 
   placeholder: "color_nav_placeholder",
   flashid: "color_nav",
   offW: 8,
   onW: 90,
   timer: null,
 
   embed: function() {  
        if (dojo.isSafari) {
            var cn = dojo.byId("color_nav_container");
            if (cn) { cn.style.display = "none"; }
            this.placeholder = "color_nav_placeholder_standalone";
            this.flashid = "color_nav_standalone";
        } 
 
        var flashvars = {
            gradient_uri: "/flash/color_nav/assets/color_gradient.png",
            application_uri: "/flash/color_play/index.tmpl",
            application_query_string: "?colorplaysample="
        };
    
        var params = {
            quality: "high",
            menu: "false",
            swliveconnect: "true",
            allowscriptaccess: "always",
            scale: "noScale",
            allowfullscreen: "false",
            wmode: "transparent",
            movie: "/flash/color_nav/color_nav.swf",
            flashvars: dojo.objectToQuery(flashvars)
        };
    
        var attr = {
            id: this.flashid,
            name: this.flashid,
            data: "/flash/color_nav/color_nav.swf",
            width: this.offW,
            height: "100%",
            hspace: 0,
            vspace:0,
            align: "top"
        };
        
        if (global.playerversion) {
            attr.playerversion = global.playerversion;
        }
    
        generic.flash.Api.embedSwf(attr, params, this.placeholder); 
         
    },
    setWidth: function(e) {   
        if (e=="mouseover") { 
             clearTimeout(colorNav.timer);  
             dojo.byId(this.flashid).style.width = this.onW + "px";  
        } else {     
             colorNav.timer = setTimeout(function(){    
                 dojo.byId(colorNav.flashid).style.width = colorNav.offW + "px";     
             }, 600);
        }
    
    }   
}


function clearField(field, value) {
    value = value ? value : "";
    field.value = value;

    if (field.createTextRange) {
        var rng = field.createTextRange();
        rng.move("character", 0);
        rng.select();
    } else if (field.selectionStart) {
        field.focus();
        field.setSelectionRange(0, 0);
    }
        
}

// popup functions

// live chat popup
var livechatPopArgs = {
    url: "/includes/live_chat_popup.tmpl",
    resizable: "no",
    scrollbars: "no",
    width: 483,
    height: 409
};

function initLiveChatPopup(btnId) {
    var lc = new generic.popup({
        activator: btnId,
        url: livechatPopArgs.url, resizable: livechatPopArgs.resizable, scrollbars: livechatPopArgs.scrollbars, width: livechatPopArgs.width, height: livechatPopArgs.height,
        onOpen: function() {
            livechat_cm_tag();
        }
    });
}
    
// for cms inline reference
function openLiveChatPopup() {
    var lc = window.open(livechatPopArgs.url, 'live_chat',"resizable=0, scrollbars=0, width=" + livechatPopArgs.width +", height=" + livechatPopArgs.height);
    
    livechat_cm_tag();
}
function openFullWindow(url, name, w, h) {
    var w = window.open(url, name, "menubar=1, toolbar=1, resizable=1, scrollbars=1, width=" + w + ", height=" + h);
}
var newsPopup = {
    open: function(id) {
        var pop = dojo.byId("pop_news-"+id);
        if (pop) {
            dojo.style(pop, "top", "0");
        }
    },
    close: function(id) {
        var pop = dojo.byId("pop_news-"+id);
        if (pop) {
            dojo.style(pop, "top", "-5000px");
        }
    }
}

function livechat_cm_tag() {
    cmCreateConversionEventTag("Live Chat", "1", "ASK AN ARTIST", "10");
}
