// JavaScript Document

var MindShare = {};

var searchDefault = 'SEARCH';

/* Auto-redirect to German site if necessary */
var redirectSource = "http://www.mindshareworld.com";
var redirectTarget = "http://www.mindshare.de";
var userLang = (navigator.language) ? navigator.language : (navigator.browserLanguage) ? navigator.browserLanguage: navigator.userLanguage;
if (navigator.userAgent.match(/\Wde\W/i)
    || navigator.appVersion.match(/\Wde\W/i)
    || userLang.match(/\W*de\W*/i)
    ) {
    if (window.location == redirectSource 
        || window.location == redirectSource + "/") {        
        if (document.referrer == "" 
            || document.referrer.indexOf(".mindshare") == -1) {
            if (document.cookie == "" 
                || document.cookie.indexOf("mindshareworld=") == -1) {
                document.cookie = "mindshareworld=1";
                window.location = redirectTarget;    
            }
        }    
    }
}

MindShare.init = function () {
    if (getElement("q")) 
    {
        searchDefault = getElement("q").value;
        MindShare.Highlight.init();
    }
    
    if(typeof(google) != 'undefined') {
        GMap2 = google.maps.Map2;
        GSmallMapControl = google.maps.SmallMapControl;
        GLatLng = google.maps.LatLng;
        GMarker = google.maps.Marker;
    }
    MindShare.GlobalNav.markup();
    MindShare.Media.processAutoVideo();
    MindShare.Invokrs.init();
    MindShare.Comments.init();
    forEach(map(getElement, ["q", "q2"]), function (elem) {
        if(elem) {
            connect(elem, "onfocus", function (ev) {
                if(elem.value == searchDefault)
                    elem.value = '';
            });
        }
    });
    
    if (getElement("officemap"))
    {
        loadmap();
    }
}
addLoadEvent(MindShare.init);

MindShare.Invokrs = {
    
    init: function () {
        MindShare.Invokrs.Login.init();
        MindShare.Invokrs.Share.init();
        MindShare.Invokrs.Offices.init();
        MindShare.Invokrs.Search.init();
    },
        
    hide: function() {
        MindShare.Invokrs.Login.hide();
        MindShare.Invokrs.Share.hide();
        MindShare.Invokrs.Offices.hide();
        MindShare.Invokrs.Search.hide();
    },
    
    shimmy: function(div, offset) {
        if(navigator.userAgent.toLowerCase().indexOf("msie 6.0") == -1)
            return;
        if(!offset) offset=0;
        div = getElement(div);
        shm = createDOM('IFRAME', { style: "background: transparent, filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'"});
        shm.id = div.id + "Shim";
        appendChildNodes(div.parentNode, shm);
        shm.style.position = "absolute";
        shm.style.left = div.offsetLeft + "px";
        shm.style.top = (div.offsetTop + offset) + "px";
        var siz = getElementDimensions(div);
        siz.h -= offset;
        setElementDimensions(shm, siz);
        setStyle(shm, {
            zIndex: getStyle(div, 'z-index') - 1, 
            display: 'block', 
            border: 'none', 
            background: 'transparent', 
            'background-color': 'transparent', 
            filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
        });
    },
    
    unshimmy: function(div) {
        shimId = getElement(div).id + "Shim";
        if (getElement(shimId)) {
            removeElement(shimId);
        }
    },
    
    magicshim: function(div) {
        /* this function is meant to be called after you have
           just hidden or show something */
        if (hasElementClass(div, "Hide")) {
            MindShare.Invokrs.unshimmy(div);
        } else {
            MindShare.Invokrs.shimmy(div);
        }
    }
};

MindShare.Invokrs.Search = {

    init: function () {
        if(getElement("invokr-search-trigger")) {
            if(getElement("invokr-search-trigger")) {
                MochiKit.Signal.connect("invokr-search-trigger", "onclick", MindShare.Invokrs.Search.toggle);
                MochiKit.Signal.connect("invokr-search-close", "onclick", MindShare.Invokrs.Search.toggle);
                MochiKit.Signal.connect("invokr-advsearch-close", "onclick", MindShare.Invokrs.Search.toggle);
            }
        }
    },
    
    hide: function () {
        if (!hasElementClass("AdvSearchForm", "Hide")) {
            addElementClass("AdvSearchForm", "Hide");
            MindShare.Invokrs.unshimmy("AdvSearchForm");
        }
    },
    
    toggle: function (ev) {
        ev.preventDefault();
        if(hasElementClass("AdvSearchForm", "Hide")) {
            if (getElement("q").value == searchDefault) {
                getElement("q2").value = "";
            } else {
                getElement("q2").value = getElement("q").value;
            }
        } else {
            getElement("q").value = getElement("q2").value;
        }
        toggleElementClass("Hide", "AdvSearchForm");
        MindShare.Invokrs.magicshim("AdvSearchForm");

        if(navigator.userAgent.toLowerCase().indexOf("msie 6.0") != -1)
            toggleElementClass("ProtectSearch", "VisualTags");
    }
    
};


MindShare.Invokrs.Login = {

    d: undefined,
    
    init: function () {
        if(getElement("invokr-login-trigger")) {
            MochiKit.Signal.connect("invokr-login-trigger", "onmouseenter", MindShare.Invokrs.Login.activate);
            MochiKit.Signal.connect("invokr-login-trigger", "onmouseleave", MindShare.Invokrs.Login.deactivate);
            MochiKit.Signal.connect("invokr-login-trigger", "onclick", MindShare.Invokrs.Login.toggle);
            MochiKit.Signal.connect("invokr-login-close", "onclick", MindShare.Invokrs.Login.hide);
        }
    },
    
    toggle: function (ev) {
        ev.preventDefault();
        if (MindShare.Invokrs.Login.d)
            MindShare.Invokrs.Login.d.cancel();
        toggleElementClass("Hide", "LoginInvokr");
        MindShare.Invokrs.magicshim("LoginInvokr");
    },
    
    activate: function (ev) {
        ev.preventDefault();
        if (hasElementClass("LoginInvokr", "Hide")) {
            MindShare.Invokrs.Login.d = MochiKit.Async.callLater(0.5, function () {
                removeElementClass("LoginInvokr", "Hide");
                MindShare.Invokrs.shimmy("LoginInvokr");
            });
        }
    },
    
    deactivate: function (ev) {
        if(MindShare.Invokrs.Login.d)
            MindShare.Invokrs.Login.d.cancel();
    },
    
    hide: function (ev) {
        if(ev) ev.preventDefault();
        addElementClass("LoginInvokr", "Hide");
        MindShare.Invokrs.unshimmy("LoginInvokr");
    }
    
};

MindShare.Invokrs.Share = {

    d: undefined,
    
    init: function () {
        if(getElement("invokr-share-trigger")) {
            MochiKit.Signal.connect("invokr-share-trigger", "onmouseenter", MindShare.Invokrs.Share.activate);
            MochiKit.Signal.connect("invokr-share-trigger", "onmouseleave", MindShare.Invokrs.Share.deactivate);
            MochiKit.Signal.connect("invokr-share-trigger", "onclick", MindShare.Invokrs.Share.toggle);
            MochiKit.Signal.connect("invokr-share-close", "onclick", MindShare.Invokrs.Share.toggle);
        }
    },
    
    toggle: function (ev) {
        ev.preventDefault();
        toggleElementClass("Hide", "Share");
        MindShare.Invokrs.magicshim("Share");
    },
    
    hide: function (ev) {
        if(ev) ev.preventDefault();
        addElementClass("Share", "Hide");
        MindShare.Invokrs.unshimmy("Share");
    },
    
    activate: function (ev) {
        ev.preventDefault();
        if (hasElementClass("Share", "Hide")) {
            MindShare.Invokrs.Share.d = MochiKit.Async.callLater(0.5, function () {
                removeElementClass("Share", "Hide");
                MindShare.Invokrs.shimmy("Share");
            });
        }
    },
    
    deactivate: function (ev) {
        if(MindShare.Invokrs.Share.d)
            MindShare.Invokrs.Share.d.cancel();
    }
    
};

MindShare.Invokrs.Offices = {

    gmapLoaded: false,
    d: undefined,

    init: function () {
        this.head = getFirstElementByTagAndClassName("head");
        if(getElement("invokr-offices-trigger")) {
            MochiKit.Signal.connect("invokr-offices-trigger", "onmouseenter", MindShare.Invokrs.Offices.activate);
            MochiKit.Signal.connect("invokr-offices-trigger", "onmouseleave", MindShare.Invokrs.Offices.deactivate);
            MochiKit.Signal.connect("invokr-offices-trigger", "onclick", MindShare.Invokrs.Offices.toggle);
        }
    },
    
    activeElements: function () {
        return getElementsByTagAndClassName(null, "invokr-link", 'OfficesInvokr');
    },
    
    // convert a /worldwide path to the invoker equivalent
    invokerPath: function (realpath) {
        if(realpath.substr(0,1) == '/')
            realpath = realpath.substr(1);
        var path = realpath.split("/");
        if(!path[path.length-1]) {
            path = path.slice(0, path.length - 1);
        }
        var path = "/" + concat([path[0], "invokr", path[1]], path.slice(2)).join("/");
        return path;
    },
    
    connectAll: function () {
        forEach(MindShare.Invokrs.Offices.activeElements(), function (elem) {
            switch (elem.id) {
                case 'invokr-offices-close':
                    MochiKit.Signal.connect(elem, 'onclick', MindShare.Invokrs.Offices.toggle);
                    break;
                case 'Country':
                    MochiKit.Signal.connect(elem, 'onchange', MindShare.Invokrs.Offices.countrySubmit);
                    break;
                case 'Office':
                    MochiKit.Signal.connect(elem, 'onchange', MindShare.Invokrs.Offices.officeSubmit);
                    break;
                default:
                    if(elem.pathname) {        
                        MochiKit.Signal.connect(elem, 'onclick', function (ev) {
                            ev.preventDefault();
                            var path = MindShare.Invokrs.Offices.invokerPath(elem.pathname);
                            MindShare.Invokrs.Offices.load(path);
                        });
                    } else  {
                        MochiKit.Signal.connect(elem, 'onclick', function (ev) { ev.preventDefault()});
                    }
                    break;
            }
        });
    },
    
    countrySubmit: function (ev) {
        ev.preventDefault();
        var href = getElement("Country").value;
        if (href) {
            var invokrPath = MindShare.Invokrs.Offices.invokerPath(href);
            MindShare.Invokrs.Offices.load(invokrPath);
        }
    },
    
    officeSubmit: function (ev) {
        ev.preventDefault();
        var href = getElement("Office").value;
        if (href) {
            var invokrPath = MindShare.Invokrs.Offices.invokerPath(href);
            MindShare.Invokrs.Offices.loadOffice(invokrPath);
        }
    },
    
    disconnectAll: function () {
        forEach(MindShare.Invokrs.Offices.activeElements(), function (elem) {
            MochiKit.Signal.disconnectAll(elem);
        });
        //this causes an Ext Debug console if no firebug: logDebug("disconnecting done");
    },
    
    showMap: function () {
        var lat;
        var lng;
        forEach(getElementsByTagAndClassName(null, "invokr-offices-latitude", 'OfficesInvokr'), function (e) {
            lat = Number(e.innerHTML);
        });
        forEach(getElementsByTagAndClassName(null, "invokr-offices-longitude", 'OfficesInvokr'), function (e) {
            lng = Number(e.innerHTML);
        });
        forEach(getElementsByTagAndClassName(null, "invokr-offices-mapzoom", 'OfficesInvokr'), function (e) {
            zoom = Number(e.innerHTML);
        });
        if(lat && lng) {
            var point = new GLatLng(lat, lng);
            if (GBrowserIsCompatible()) {
                if(!MindShare.Invokrs.Offices.map) {
                    MindShare.Invokrs.Offices.map = new GMap2(document.getElementById("map"));
                    var map = MindShare.Invokrs.Offices.map;
                    map.addControl(new GSmallMapControl());
                    map.setCenter(point, zoom);
                    map.addOverlay(new GMarker(point));
                } else {
                    var map = MindShare.Invokrs.Offices.map;
                    map.addOverlay(new GMarker(point));
                    map.panTo(point);
                }
            }
        }
    },
    
    load: function (path) {
        var self = this;
        MindShare.Invokrs.Offices.disconnectAll();
        MindShare.Invokrs.Offices.map = undefined;
        var invokr = getElement("OfficesInvokr");
        return loadJSONDoc(path).addCallback(function (response) {
            invokr.innerHTML = response.body;
            MindShare.Invokrs.Offices.connectAll();
            MindShare.Invokrs.Offices.showMap();
            removeElementClass(invokr, "Hide");
            MindShare.Invokrs.shimmy(invokr, 90);
        });
    },
    
    loadOffice: function (path) {
        var invokr = getElement("OfficesInvokr");
        return loadJSONDoc(path).addCallback(function (response) {
            forEach(getElementsByTagAndClassName("div", "Address", invokr), function (elem) {
                elem.innerHTML = response.body;
                MindShare.Invokrs.Offices.showMap();
            });
            // yes, this is a hack
            forEach(getElementsByTagAndClassName("ul", "ExtraLinks", invokr), function (elem) {
                var n =getElement("invokr-offices-url");
                replaceChildNodes(elem, LI(null, A({href: n.href.toLowerCase()}, n.innerHTML)));
            });

        }).addErrback(logError);
    },
    
    toggle: function (ev) {
        ev.preventDefault();
        if (MindShare.Invokrs.Offices.d)
            MindShare.Invokrs.Offices.d.cancel();
        var invokr = getElement("OfficesInvokr");
        if(hasElementClass(invokr, "Hide")) {
            MindShare.Invokrs.Offices.load("/worldwide/invokr");
        } else {
            addElementClass(invokr, "Hide");
            MindShare.Invokrs.unshimmy(invokr);
        }
    },
    
    hide: function (ev) {
        if(ev) ev.preventDefault();
        addElementClass("OfficesInvokr", "Hide");
        MindShare.Invokrs.unshimmy("OfficesInvokr");
    },
    
    activate: function (ev) {
        ev.preventDefault();
        if(hasElementClass("OfficesInvokr", "Hide")) {
            MindShare.Invokrs.Offices.d = MochiKit.Async.callLater(0.5, function () {
                MindShare.Invokrs.Offices.load("/worldwide/invokr");
            });
        }
    },
    
    deactivate: function (ev) {
        if(MindShare.Invokrs.Offices.d)
            MindShare.Invokrs.Offices.d.cancel();
    }
};

MindShare.GlobalNav = {

    Ids: [],

    closeOtherMenus: function (notId) {
        forEach(MindShare.GlobalNav.Ids, function (id) {
            if(id != notId) 
                removeElementClass(id, 'RollOver');
        });
    },
    
    markup: function () {
        forEach(getElementsByTagAndClassName('li', 'Tab'), function (elem) {
            MindShare.GlobalNav.Ids.push(elem.id);
            var d;
            
            //Resize each global menu to fit its contents
            //var original = MochiKit.Style.getElementPosition(elem);
            var widest = MochiKit.Style.getElementDimensions(elem).w;
            //MochiKit.Style.setElementPosition(elem, {x:10000, y:10000})            
            addElementClass(elem, 'RollOver');       

            forEach(getElementsByTagAndClassName('li', null, elem), function (subelem) {
                if (MochiKit.Style.getElementDimensions(subelem).w > widest)
                {
                    widest = MochiKit.Style.getElementDimensions(subelem).w;
                }
            });
            //MochiKit.Style.setElementPosition(elem, original) //removed: plonked the menu in a random place
                      
            MochiKit.Style.setElementDimensions(elem.firstChild, {w:widest+2, h:MochiKit.Style.getElementDimensions(elem.firstChild).h});
            
            forEach(getElementsByTagAndClassName('li', null, elem), function (subelem) {               
                MochiKit.Style.setElementDimensions(subelem, {w:widest-2, h:MochiKit.Style.getElementDimensions(subelem).h});                
            });

            //resize the bottom border too
            forEach(getElementsByTagAndClassName('div', 'foot', elem), function (subelem) {
                MochiKit.Style.setElementDimensions(subelem, {w:widest+4, h:MochiKit.Style.getElementDimensions(subelem).h});
            });

            removeElementClass(elem, 'RollOver');
            

            MochiKit.Signal.connect(elem, 'onmouseover', function () {
                if(d) d.cancel();
                MochiKit.Async.callLater(0.1, MindShare.GlobalNav.closeOtherMenus, elem.id);
                d = MochiKit.Async.callLater(0.5, function () {
                    addElementClass(elem, 'RollOver');
                });
            });
            MochiKit.Signal.connect(elem, 'onmouseout', function () {
                if(d) d.cancel();
                d = MochiKit.Async.callLater(0.1, function () {
                removeElementClass(elem, 'RollOver');
                });
            });
        });
    }
}

MindShare.Media = {
    processAutoVideo: function () {
        forEach(getElementsByTagAndClassName('div', 'AutoVideo'), function (elem) {
            var id = elem.id;
            var asset;
            var thumbnail;
            forEach(getElementsByTagAndClassName('span', 'ExoAsset', elem), function (e) {
                asset = e.innerHTML;
            });
            forEach(getElementsByTagAndClassName('span', 'ExoThumb', elem), function (e) {
                thumbnail = e.innerHTML;
            });
            
            var s1 = new SWFObject("/static/flvplayer.swf","single","300","170","7");
            s1.addParam("allowfullscreen","true");
            s1.addVariable("file",asset + "/flashvideo.flv");
            s1.addVariable("image",thumbnail);
            s1.write(id);
            removeElementClass(elem, 'AutoVideo');
        });
    }
}

MindShare.Highlight = {
    highlightTerms: function(node, word) {
      if (!(word && word.length > 0)) return;
      node = getElement(node);
      forEach(node.childNodes, function(child) { MindShare.Highlight.highlightTerms(child, word); });
      if (node.nodeType == 3) {
        var contents = node.nodeValue;
        var idx = contents.toLowerCase().indexOf(word.toLowerCase());
        if (idx >= 0) {
          var parent = node.parentNode;
          if (parent.nodeName.toLowerCase() != "strong") {
            appendChildNodes(parent, contents.substr(0, idx), STRONG(contents.substr(idx, word.length)), contents.substr(idx+word.length));
            removeElement(node);
          }
        }
      }
    },

    getSearchTermsFromURI: function(uri) {
      if (typeof decodeURI != 'undefined' && typeof unescape != 'undefined') {
        uri = unescape(decodeURI(uri));
        var qfinder = new RegExp("q=([^&]*)", "gi");
        var qq = qfinder.exec(uri);
        if (qq && qq[1]) {
          terms = qq[1];
          return terms.replace("+", " ");
        }
      }
      return "";
    },
    
    init: function() {
      terms = MindShare.Highlight.getSearchTermsFromURI(document.location);
      if (terms && terms.length > 0) {
          MindShare.Highlight.highlightTerms("PageWrapper", terms);
      }
    }
}

MindShare.Comments = {
    init: function() {
        elem = getElement("CommentFormLink");
        if (elem) {
            connect(elem, "onclick", function (ev) {
                ev.preventDefault();
                toggleElementClass("Hide", "CommentForm");
            });
        }
        
        forEach(getElementsByTagAndClassName("a", "CommentExpand"), function (elem) { 
            if (elem) {
                connect(elem, "onclick", function (ev) {
                    ev.preventDefault();
                    e = Ext.get(elem);
                    e.getNextSibling().style.display = "inline";
                    e.remove();
                });
            }
        });
    },
    
    updateWorkflow: function(id, ref, newstate) {
        applyTransition(id, ref, newstate, MindShare.Comments.refreshWorkflow);
    },
    
    refreshWorkflow: function(response) {
        var elem = response.responseXML.documentElement;
        var success = Ext.DomQuery.selectValue("@success", elem);
        if(success == 'true') {
            window.location.reload(true);
        } else {
            Ext.MessageBox.alert("Error", "Unable to update this comments workflow state");
        }
    }
}