var $Y = YAHOO.lang;
var $D = YAHOO.util.Dom;
var $E = YAHOO.util.Event;
var $W = YAHOO.widget;
var $A = YAHOO.util.Anim;
var $ = $D.get;
var pRe = {};
pRe.globals = {};
pRe.baseFn = function() {
    var lightBoxes = {};
    return {
        init : function() {
//            this.preTabs = new $W.TabView("pre-infoTabs");
            var preMenuBar = new YAHOO.widget.MenuBar("pre-nav-container", {
                                                           autosubmenudisplay: true,
                                                           hidedelay: 750,
                                                           lazyload: true });

            preMenuBar.render();
            this.toggleLinks = $D.getElementsByClassName("pre-faqs-qlnk");
            for(var i=0; i<this.toggleLinks.length; i++) {
                $E.addListener(this.toggleLinks[i],"click",this.animateElements,this);
            }
            $E.addListener($D.getElementsByClassName('pre-view-demo-button','a'), 'click', function(e) {
                    $E.stopPropagation(e);
                    $E.preventDefault(e);
                    player = $D.get('mpl');
                    player.sendEvent("PLAY","true");        
                }
            );
            $E.on($D.getElementsByClassName('pre-popup', 'a'), 'click', function (e) {
                var dimensions = this.getAttribute("rel").split('x');
                window.open(this.href, "PowerReviewsExpressPopupWindow", 'width=' + dimensions[0] + ',height=' + dimensions[1] + ',scrollbars=yes,resizable=yes');
                $E.stopPropagation(e);
                $E.preventDefault(e);
            });
            this.lightBoxSetup();
        },
        curry : function (fn, scope) {
            scope = scope || window;
            var args = [];
            for (var i = 2, len = arguments.length; i < len; ++i) {
                args.push(arguments[i]);
            }
            return function () {
                fn.apply(scope, args);
            };
        },
        newPopWin : function(dimensions,url,e){
            var dimensions = dimensions.split('x');
            window.open(url, "PowerReviewsExpressPopupWindow", 'width=' + dimensions[0] + ',height=' + dimensions[1] + ',scrollbars=yes,resizable=yes');
            $E.stopPropagation(e);
            $E.preventDefault(e);
        },
        trackEvents : function(e) {
            if(e==undefined||e=="[object]"){
                uri=this
            } else {
                currentIndex = pRe.baseFn.preTabs.getTabIndex(e.newValue);
                document.title = 'PowerReviews Express - ' + pRe.baseFn.tabs[currentIndex].id.replace(/\s+$/, '');
                uri = '/'+pRe.baseFn.tabs[currentIndex].id;
            }
            var pageTracker = _gat._getTracker("UA-5990733-1");
            pageTracker._trackPageview(uri);
        },
        toggleElements : function(e,controlNode,refEl) {
            if(controlNode && refEl) {
                if($D.hasClass(refEl,"show")) {
                    $D.removeClass(controlNode,"selected");
                    $D.removeClass(refEl,"show");
                } else {
                    $D.addClass(controlNode,"selected");
                    $D.addClass(refEl,"show");
                }
            }
            // to disable control node's default behaviour
            return false;
        },
        animateElements : function(e,obj) {
            $E.preventDefault(e);

            if(this.rel) {
                controlNode = this;
            }
            if(typeof(controlNode) == "string") {
                controlNode = $D.get(controlNode);
            }
            // [0] = object id | [1] = animation type (fade, slide) | [2] = animation duration (seconds)
            var linkClicked = this;
            var objParameters = controlNode.rel.split(",");
            var refEl = $D.get(objParameters[0]);
            var objStatus = $D.hasClass(refEl,"show"); // if true, object is shown
            switchClasses = function() {
                obj.toggleOtherElements(e,linkClicked,refEl);
                obj.toggleElements(e,linkClicked,refEl);
            }
            if(objParameters[1] == "fade") {
                if(objStatus == true) {
                    var attributes = {
                        opacity: { from: 1, to: 0 }
                    }
                    var objAnim = new YAHOO.util.Anim(objParameters[0],attributes);
                    objAnim.useSeconds = false;
                    objAnim.duration = objParameters[2];
                    objAnim.onComplete.subscribe(switchClasses);
                    objAnim.animate();
                } else {
                    $D.setStyle(objParameters[0],"opacity",0);
                    switchClasses();
                    var attributes = {
                        opacity: { from: 0, to: 1 }
                    }
                    var objAnim = new YAHOO.util.Anim(objParameters[0],attributes);
                    objAnim.useSeconds = false;
                    objAnim.duration = objParameters[2];
                    objAnim.animate();
                }
            } else {
                switchClasses();
            }
        },
        toggleOtherElements : function(e,linkClicked,refEl) {
            // toggle selected state of other elements pointing to the same source
            for(var i=0; i<this.toggleLinks.length; i++) {
                var objParameters = this.toggleLinks[i].rel.split(",");
                var linkClickedParameters = linkClicked.rel.split(",");

                if(objParameters[0] == linkClickedParameters[0]) {
                    if($D.hasClass(this.toggleLinks[i],"selected")) {
                        $D.removeClass(this.toggleLinks[i],"selected");
                    } else {
                        $D.addClass(this.toggleLinks[i],"selected");
                    }
                }
            }
        },
        lightBoxSetup : function (root) {
            var boxes = $D.getElementsByClassName('pre-lightBox', null, root);
            $E.addListener(boxes, "click", this.lightBox);
        },
        lightBox : function (e) {
            $E.preventDefault(e);
            var rel = this.rel;
            if (!lightBoxes[rel]) {
                var dimensions = rel.split('x');
                var lbWidth = dimensions[0];
                var lbHeight = dimensions[1];
                if (lbHeight > 600) {
                    lbHeight = (lbHeight * (0.75));
                    lbWidth = (lbWidth * (0.75));
                }
                var title = this.getAttribute('ti');
                var content;
                if (dimensions.length === 2) {
                    content = "<h2>" + title + "</h2><img src='" + this.href + "' width='" + lbWidth + "' height='" + lbHeight + "'/>";
                }
                else {
                    content = $(dimensions[2]);
                    $D.setStyle(content, 'display', 'block');
                }
                var lightBoxObj = new YAHOO.widget.Panel("bz-panel-lightBox-" + rel, {
                    visible: false,
                    draggable: false,
                    close: true,
                    modal: true,
                    fixedcenter: true
                });
                lightBoxObj.setBody(content);
                lightBoxObj.cfg.setProperty("zindex", "12003");
                lightBoxObj.render(document.body);

                lightBoxes[rel] = lightBoxObj;
            }
            lightBoxes[rel].show();
        },
        setTab : function(id) {
            var currTab = $(id);
            $D.addClass(currTab,'curr-nav-selected');
        },
        carouselSetup:function(){
            pRe.baseFn.carousel = new $W.Carousel("pre-carousel", {
                animation: { speed: 0.9 }
            });
            pRe.baseFn.carousel.render();
            pRe.baseFn.carousel.show("pre-carousel");
        },
        carouselNavSetup : function() {
            var oCTabs = $D.getElementsByClassName("carousel-tab","a");
            for (var i=0; i < oCTabs.length; i++) {
                $E.addListener(oCTabs[i],"click", this.carouselOperator);
            }
        },
        carouselOperator : function(e,cfg) {
            $E.stopPropagation(e);
            $E.preventDefault(e);
            if(cfg){
                var config = cfg;
            } else {
                var config = YAHOO.lang.JSON.parse(this.rel);
            }
            pRe.baseFn.carousel.scrollTo(config.tabindex);
            if (config.targetTab){
                selectedTab = document.getElementById(config.targetTab);
                pRe.baseFn.selectedTab = selectedTab;
            } else {
                pRe.baseFn.selectedTab = this;
            }
            pRe.baseFn.carousel.subscribe('navigationStateChange',function() {
                if (!$D.hasClass(pRe.baseFn.selectedTab,"selected")) {
                    gParentCont = $D.getAncestorByClassName(pRe.baseFn.selectedTab,"carousel-control");
                    selectedParent = $D.getAncestorByTagName(pRe.baseFn.selectedTab,'li');
                    adjToSelected = $D.getPreviousSibling(selectedParent)
                    $D.getElementsByClassName('selected','a',gParentCont, function(el){
                        (function() { $D.removeClass(el,'selected') })()
                    });
                    $D.getElementsByClassName('next-selected','li',gParentCont, function(el){
                        (function() { $D.removeClass(el,'next-selected') })()
                    });
                    $D.addClass(pRe.baseFn.selectedTab, 'selected');
                    $D.addClass(adjToSelected, 'next-selected');
                }
            });
        },
        setupTooltips : function(els) {
            if(els) {
                pRe.pricingTt = new YAHOO.widget.Tooltip("pre-tt", {
                        context:els,
                        width:400                        
                    });
            }
        },
        getUrlVars:function() {
            var vars = [], hash;
            var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
            for(var i = 0; i < hashes.length; i++) {
                hash = hashes[i].split('=');
                vars.push(hash[0]);
                vars[hash[0]] = hash[1];
            }
            return vars;
        }
    }
}();
pRe.baseFn.init();
