Function.prototype.closure = function(obj) {
    // Init object storage.
    if (!window.__objs)
        window.__objs = [];

    // Init closure storage.
    if (!this.__closureFuncs)
        this.__closureFuncs = [];

    // Make sure the object has an id and is stored in the object store.
    var objId = obj.__closureObjId;
    if (!objId)
        __objs[objId = obj.__closureObjId = __objs.length] = obj;

    // See if we previously created a closure for this object/function pair.
    var closureFunc = this.__closureFuncs[objId];
    if (closureFunc)
        return closureFunc;

    // Create the closure, store in cache and return result.
    var me = this;
    return this.__closureFuncs[objId] = function() {
        return me.apply(__objs[objId], arguments);
    };
    
    // Clear reference to keep the object out of the closure scope.
    obj = null;
};


//** Featured Content Slider script- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com.
//** May 2nd, 08'- Script rewritten and updated to 2.0.
//** June 12th, 08'- Script updated to v 2.3, which adds the following features:
			//1) Changed behavior of script to actually collapse the previous content when the active one is shown, instead of just tucking it underneath the later.
			//2) Added setting to reveal a content either via "click" or "mouseover" of pagination links (default is former).
			//3) Added public function for jumping to a particular slide within a Featured Content instance using an arbitrary link, for example.

//** July 11th, 08'- Script updated to v 2.4:
			//1) Added ability to select a particular slide when the page first loads using a URL parameter (ie: mypage.htm?myslider=4 to select 4th slide in "myslider")
			//2) Fixed bug where the first slide disappears when the mouse clicks or mouses over it when page first loads.

var featuredcontentslider = {

    //3 variables below you can customize if desired:
    ajaxloadingmsg: '<div style="margin: 20px 0 0 20px"><img src="loading.gif" /> Fetching slider Contents. Please wait...</div>',
    bustajaxcache: true, //bust caching of external ajax page after 1st request?
    enablepersist: false, //persist to last content viewed when returning to page.
    // do not set to true, since the number of pages of the current view 
    // could have less then the previous view

    settingcaches: {}, //object to cache "setting" object of each script instance

    jumpTo: function(fcsid, pagenumber) { //public function to go to a slide manually.
        this.turnpage(this.settingcaches[fcsid], pagenumber)
    },

    ajaxconnect: function(setting) {
        var page_request = false
        if (window.ActiveXObject) { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
            try {
                page_request = new ActiveXObject("Msxml2.XMLHTTP")
            }
            catch (e) {
                try {
                    page_request = new ActiveXObject("Microsoft.XMLHTTP")
                }
                catch (e) { }
            }
        }
        else if (window.XMLHttpRequest) // if Mozilla, Safari etc
            page_request = new XMLHttpRequest()
        else
            return false
        var pageurl = setting.contentsource[1]
        page_request.onreadystatechange = function() {
            featuredcontentslider.ajaxpopulate(page_request, setting)
        }
        document.getElementById(setting.id).innerHTML = this.ajaxloadingmsg
        var bustcache = (!this.bustajaxcache) ? "" : (pageurl.indexOf("?") != -1) ? "&" + new Date().getTime() : "?" + new Date().getTime()
        page_request.open('GET', pageurl + bustcache, true)
        page_request.send(null)
    },

    ajaxpopulate: function(page_request, setting) {
        if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1)) {
            document.getElementById(setting.id).innerHTML = page_request.responseText
            this.buildpaginate(setting)
        }
    },

    buildcontentdivs: function(setting) {
        var alldivs = document.getElementById(setting.id).getElementsByTagName("div") //gets all images
        for (var i = 0; i < alldivs.length; i++) {
            if (this.css(alldivs[i], "contentdiv", "check")) { //check for DIVs with class "contentdiv"
                setting.contentdivs.push(alldivs[i])
                alldivs[i].style.display = "none" //collapse all content DIVs to begin with
            }
        }
    },

    insertafter: function(newChild, refChild) {
        refChild.parentNode.insertBefore(newChild, refChild.nextSibling);
    },

    createpager: function(setting) {
        this.buildcontentdivs(setting);
        var sliderdiv = document.getElementById(setting.id)
        for (var j = 1; j <= setting.numberOfPagers; j++) {
            var pagerdiv = document.getElementById("Pager" + setting.id + j.toString());    // get pager div
            if (pagerdiv != null) {
                var pagerBtnNode = document.getElementById("pagenumber" + j.toString() + "_" + setting.id); // get pager button
                if (pagerBtnNode != null) {
                    if (setting.contentdivs.length > 0) {
                        for (var i = 0; i < sliderdiv.childNodes.length - 1; i++) {   // clone pager buttons by the number of slides
                            //change id
                            var pageElem = pagerBtnNode.cloneNode(true);
                            this.insertafter(pageElem, pagerBtnNode);
                        }
                    }
                }
                // 1. for each pagenumber in pagerdiv, if contains <a>, change it, if not, add <a> and change it.
                // 2. if next, change next
                // 3. if prev, change prev
                for (var i = 0, k = 0; i < pagerdiv.childNodes.length; i++) {
                    var pagerNode = pagerdiv.childNodes[i];
                    switch (pagerNode.id) {
                        case ("pagenumber" + j.toString() + "_" + setting.id):
                            if (setting.contentdivs.length == 0) {
                                pagerNode.parentNode.removeChild(pagerNode);
                                break;
                            }
                            var pagerLink = pagerNode.getElementsByTagName("a");
                            if (pagerLink.length == 0) {
                                pagerNode.innerHTML = "<a>" + pagerNode.innerHTML + "</a>";
                                pagerLink = pagerNode.getElementsByTagName("a");
                            }
                            if (pagerLink.length > 0) {
                                pagerLink[0].setAttribute("onclick", "return false;");  // make pager buttons unclickable 
                                pagerLink[0].setAttribute("rel", ++k);
                                pagerLink[0][setting.revealtype] = function() {
                                    featuredcontentslider.turnpage(setting, this.getAttribute("rel"))
                                    return false
                                }
                                if (document.all) {
                                    pagerLink[0].innerText = k;
                                } else {
                                    pagerLink[0].textContent = k;
                                }
                                setting.toclinks.push(pagerLink[0])
                            }
                            break;
                        default:
                            break;
                    }

                }
                setting.pagerDivs[j] = pagerdiv;
            }
            if (setting.displayPageCount != "") {
                var pageCounter = document.getElementById("pagecount" + j.toString() + "_" + setting.id)
                if (pageCounter != null) {
                    setting.pageCounters[j] = pageCounter;
                    if (document.all) {
                        setting.pagecountstrings[j] = pageCounter.innerText;
                    } else {
                        setting.pagecountstrings[j] = pageCounter.textContent;
                    }
                }
            }
        }

        this.turnpage(setting, setting.currentpage, true)
        if (setting.autorotate[0]) {        //if auto rotate enabled
            for (var j = 1; j <= setting.numberOfPagers; j++) {
                var pagerdiv = setting.pagerDivs[j];
                if (pagerdiv != null) {
                    pagerdiv[setting.revealtype] = function() {
                        featuredcontentslider.cleartimer(setting, window["fcsautorun" + setting.id])
                    }
                }
            }

            var stopRotating = document.getElementsByName("stoprotating_" + setting.id);
            if (stopRotating != null) {
                for (var i = 0; i < stopRotating.length; i++) {
                    if (stopRotating[i].getAttribute("onclick") == null) {
                        //stop content slider when links with stoprotating names are clicked on
                        stopRotating[i]["onclick"] = function() {
                            featuredcontentslider.cleartimer(setting, window["fcsautorun" + setting.id]);
                        }
                    }
                    else {
                        if (stopRotating[i].addEventListener) {
                            stopRotating[i].addEventListener("click", function() {
                                featuredcontentslider.cleartimer(setting, window["fcsautorun" + setting.id]);
                            }, false);
                        }
                        else if (stopRotating[i].attachEvent) {
                            stopRotating[i].attachEvent("onclick", function() {
                                featuredcontentslider.cleartimer(setting, window["fcsautorun" + setting.id]);
                            } .closure(stopRotating[i]));
                        }
                    }
                }
            }

            sliderdiv["onclick"] = function() { //stop content slider when slides themselves are clicked on
                featuredcontentslider.cleartimer(setting, window["fcsautorun" + setting.id]);
            }
            setting.autorotate[1] = setting.autorotate[1] + (1 / setting.enablefade[1] * 50) //add time to run fade animation (roughly) to delay between rotation
            this.autorotate(setting)
        }
    },

    urlparamselect: function(fcsid) {
        var result = window.location.search.match(new RegExp(fcsid + "=(\\d+)", "i")) //check for "?featuredcontentsliderid=2" in URL
        return (result == null) ? null : parseInt(RegExp.$1) //returns null or index, where index (int) is the selected tab's index
    },

    addHandler: function(target, eventName, handlerName) {
        if (target.addEventListener)
            target.addEventListener(eventName, handlerName, false);
        else if (target.attachEvent)
            target.attachEvent("on" + eventName, handlerName);
        //        else
        //            target["on" + eventName] = handlerName;
    },

    turnpage: function(setting, thepage, autocall) {
        var currentpage = setting.currentpage //current page # before change
        var totalpages = setting.contentdivs.length
        if (totalpages > 0) {
            var turntopage = (/prev/i.test(thepage)) ? currentpage - 1 : (/next/i.test(thepage)) ? currentpage + 1 : parseInt(thepage)
            turntopage = (turntopage < 1) ? totalpages : (turntopage > totalpages) ? 1 : turntopage //test for out of bound and adjust
            if (turntopage == setting.currentpage && typeof autocall == "undefined") //if a pagination link is clicked on repeatedly
                return
            setting.currentpage = turntopage
            setting.contentdivs[turntopage - 1].style.zIndex = ++setting.topzindex
            this.cleartimer(setting, window["fcsfade" + setting.id])
            setting.cacheprevpage = setting.prevpage
            if (setting.enablefade[0] == true) {
                setting.curopacity = 0
                this.fadeup(setting)
            }
            if (setting.enablefade[0] == false) { //if fade is disabled, fire onChange event immediately (verus after fade is complete)
                setting.contentdivs[setting.prevpage - 1].style.display = "none" //collapse last content div shown (it was set to "block")
                setting.onChange(setting.prevpage, setting.currentpage)
            }
            if (setting.contentdivs[setting.prevpage - 1].style.display == "block") {   //fixed bug, when 2 slides are shown
                setting.contentdivs[setting.prevpage - 1].style.display = "none";
            }
            setting.contentdivs[turntopage - 1].style.visibility = "visible"
            setting.contentdivs[turntopage - 1].style.display = "block"
            if (setting.prevpage <= setting.toclinks.length) { //make sure pagination link exists (may not if manually defined via "markup", and user omitted)
                for (var i in setting.toclinks) {
                    this.css(setting.toclinks[i], "selected", "remove")
                }
            }
            var rel = 0;
            if (turntopage <= setting.toclinks.length) { //make sure pagination link exists (may not if manually defined via "markup", and user omitted)
                this.css(setting.toclinks[turntopage - 1], "selected", "add")
                rel = setting.toclinks[turntopage - 1].rel
            }
            for (var i in setting.toclinks) {
                if (setting.toclinks[i].rel == rel && setting.toclinks[i].className != " selected") {
                    this.css(setting.toclinks[i], "selected", "add")
                }
            }
            setting.prevpage = turntopage
            if (this.enablepersist)
                this.setCookie("fcspersist" + setting.id, turntopage)
            if (setting.pageCounters.length > 0) {
                for (var i in setting.pageCounters) {
                    if (document.all) {
                        setting.pageCounters[i].innerText =
                        setting.pagecountstrings[i].replace("#numberOf", setting.currentpage + " of " + setting.contentdivs.length);
                    }
                    else {
                        setting.pageCounters[i].textContent =
                       setting.pagecountstrings[i].replace("#numberOf", setting.currentpage + " of " + setting.contentdivs.length);
                    }
                }
            }
        }
    },

    setopacity: function(setting, value) { //Sets the opacity of targetobject based on the passed in value setting (0 to 1 and in between)
        if (setting.contentdivs.length > 0) {
            var targetobject = setting.contentdivs[setting.currentpage - 1];
            var s = targetobject.style;
            if (typeof (s.filter) != "undefined") { // IE5.5+
                s.filter = "alpha(opacity:" + value * 100 + ")";
            }
            else if (typeof targetobject.style.MozOpacity != "undefined") //Old Mozilla syntax
                targetobject.style.MozOpacity = value
            else if (typeof targetobject.style.opacity != "undefined") //Standard opacity syntax
                targetobject.style.opacity = value
            setting.curopacity = value
        }
    },

    fadeup: function(setting) {
        if (setting.contentdivs.length > 0) {
            if (setting.curopacity < 1) {
                this.setopacity(setting, setting.curopacity + setting.enablefade[1])
                window["fcsfade" + setting.id] = setTimeout(function() { featuredcontentslider.fadeup(setting) }, 50)
            }
            else { //when fade is complete
                if (setting.cacheprevpage != setting.currentpage) //if previous content isn't the same as the current shown div (happens the first time the page loads/ script is run)
                    setting.contentdivs[setting.cacheprevpage - 1].style.display = "none" //collapse last content div shown (it was set to "block")
                setting.onChange(setting.cacheprevpage, setting.currentpage)
            }
        }
    },

    cleartimer: function(setting, timervar) {
        if (typeof timervar != "undefined") {
            clearTimeout(timervar)
            clearInterval(timervar)
            if (setting.contentdivs.length > 0) {
                if (setting.cacheprevpage != setting.currentpage) { //if previous content isn't the same as the current shown div
                    setting.contentdivs[setting.cacheprevpage - 1].style.display = "none"
                }
            }
        }
    },

    css: function(el, targetclass, action) {
        var needle = new RegExp("(^|\\s+)" + targetclass + "($|\\s+)", "ig");
        var pos = el.className.toString().indexOf(targetclass);
        if (action == "check")
            return needle.test(el.className)
        else if (action == "remove")
            el.className = el.className.replace(needle, "")
        else if (action == "add" && pos < 0)
            el.className += " " + targetclass
    },

    autorotate: function(setting) {
        window["fcsautorun" + setting.id] = setInterval(function() { featuredcontentslider.turnpage(setting, "next") }, setting.autorotate[1])
    },

    getCookie: function(Name) {
        var re = new RegExp(Name + "=[^;]+", "i"); //construct RE to search for target name/value pair
        if (document.cookie.match(re)) //if cookie found
            return document.cookie.match(re)[0].split("=")[1] //return its value
        return null
    },

    setCookie: function(name, value) {
        document.cookie = name + "=" + value

    },


    init: function(setting) {
        var persistedpage = this.getCookie("fcspersist" + setting.id) || 1
        var urlselectedpage = this.urlparamselect(setting.id) //returns null or index from: mypage.htm?featuredcontentsliderid=index
        this.settingcaches[setting.id] = setting //cache "setting" object
        setting.contentdivs = []
        setting.toclinks = []
        setting.pagecountstrings = []
        setting.pagerDivs = []
        setting.pageCounters = []
        setting.topzindex = 0
        setting.currentpage = urlselectedpage || ((this.enablepersist) ? persistedpage : 1)
        setting.prevpage = setting.currentpage
        setting.revealtype = "on" + (setting.revealtype || "click")
        setting.curopacity = 0
        setting.placeholderId = ""
        setting.onChange = setting.onChange || function() { }
        if (setting.contentsource[0] == "inline")
            this.createpager(setting)
        if (setting.contentsource[0] == "ajax")
            this.ajaxconnect(setting)
    }

}

function openPopup(url, open, keys, values, popupParams) {
    var popupHtml;
    var popup;
    if (keys && values && keys.length > 0) {
        popupHtml = "<html><head></head><body><form id='popupid' method='post' action='" + url + "'>";
        for (var i = 0; i < keys.length; i++) {
            popupHtml += "<input type='hidden' name=\"" + keys[i] + "\" value=\"" + values[i] + "\"/>";
        }
        popupHtml += "</form><script type=\"text/javascript\"> document.getElementById(\"popupid\").submit()</script></body></html>";
        popup = window.open(url, open, popupParams);
        popup.document.write(popupHtml);
    }
    else 
       popup = window.open(url, open, popupParams);
    
    if (!popup) return false;
    else return popup;
}

function zoomOnClick(slideshowId, urlImageDirectory, open, popupParams) {
    var alldivs = document.getElementById(slideshowId).getElementsByTagName("div")
    for (var i = 0; i < alldivs.length; i++) {
        if (alldivs[i].style.display != "none") {
            var currentImage = alldivs[i].getElementsByTagName("img");
            if (currentImage[0]) {
                var imgUrl = currentImage[0].src;
                var filename = imgUrl.substring(imgUrl.lastIndexOf("/") + 1);
                if (filename != "") {
                    window.open(urlImageDirectory + "&file=" + filename, open, popupParams);
                }
            }
        }
    }
}
