2 Copyright (C) 2005 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 /* some generic JavaScript code for SOGo */
23 // TODO: replace things with Prototype where applicable
32 var activeAjaxRequests = 0;
35 var allDocumentElements = null;
37 /* a W3C compliant document.all */
38 function getAllScopeElements(scope) {
39 var elements = new Array();
41 for (var i = 0; i < scope.childNodes.length; i++)
42 if (typeof(scope.childNodes[i]) == "object"
43 && scope.childNodes[i].tagName
44 && scope.childNodes[i].tagName != '')
46 elements.push(scope.childNodes[i]);
47 var childElements = getAllElements(scope.childNodes[i]);
48 if (childElements.length > 0)
49 elements.push(childElements);
55 function getAllElements(scope) {
62 && allDocumentElements != null)
63 elements = allDocumentElements;
66 elements = getAllScopeElements(scope);
67 if (scope == document)
68 allDocumentElements = elements;
75 http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/ */
76 function getElementsByClassName2(_tag, _class, _scope) {
77 var regexp, classes, elements, element, returnElements;
79 _scope = _scope || document;
81 elements = (!_tag || _tag == "*"
82 ? getAllElements(null)
83 : _scope.getElementsByTagName(_tag));
86 classes = _class.split(/\s+/);
87 regexp = new RegExp("(^|\s+)("+ classes.join("|") +")(\s+|$)","i");
90 for(var i = 0; element = elements[i]; i++) {
91 if (regexp.test(element.className)) {
92 returnElements.push(element);
95 return returnElements;
101 function ml_stripActionInURL(url) {
102 if (url[url.length - 1] != '/') {
105 i = url.lastIndexOf("/");
106 if (i != -1) url = url.substring(0, i);
108 if (url[url.length - 1] != '/') // ensure trailing slash
113 function URLForFolderID(folderID) {
114 var folderInfos = folderID.split(":");
116 if (folderInfos.length > 1) {
117 url = UserFolderURL + "../" + folderInfos[0];
118 if (folderInfos[1][0] != '/')
120 url += folderInfos[1];
123 url = ApplicationBaseURL + folderInfos[0];
125 if (url[url.length-1] == '/')
126 url = url.substr(0, url.length-1);
131 function extractEmailAddress(mailTo) {
135 = /([a-zA-Z0-9]+[a-zA-Z0-9\._-]+[a-zA-Z0-9]+@[a-zA-Z0-9]+[a-zA-Z0-9\._-]+[a-zA-Z0-9]+)/g;
136 if (emailre.test(mailTo)) {
137 emailre.exec(mailTo);
144 function extractEmailName(mailTo) {
147 var emailNamere = /(.+)\ </;
148 if (emailNamere.test(mailTo)) {
149 emailNamere.exec(mailTo);
150 emailName = RegExp.$1;
156 function sanitizeMailTo(dirtyMailTo) {
157 var emailName = extractEmailName(dirtyMailTo);
158 var email = "" + extractEmailAddress(dirtyMailTo);
161 if (emailName && emailName.length > 0)
162 mailto = emailName + ' <' + email + '>';
169 function openUserFolderSelector(callback, type) {
170 var urlstr = ApplicationBaseURL;
171 if (urlstr[urlstr.length-1] != '/')
173 urlstr += ("../../" + UserLogin + "/Contacts/userFolders");
174 var w = window.open(urlstr, "User Selector",
175 "width=322,height=250,resizable=1,scrollbars=0");
177 w.userFolderCallback = callback;
178 w.userFolderType = type;
182 function openMailComposeWindow(url) {
183 var w = window.open(url, null,
184 "width=680,height=520,resizable=1,scrollbars=1,toolbar=0,"
185 + "location=0,directories=0,status=0,menubar=0"
192 function openMailTo(senderMailto) {
193 var mailto = sanitizeMailTo(senderMailto);
195 if (mailto.length > 0)
196 openMailComposeWindow(ApplicationBaseURL
197 + "/../Mail/compose?mailto=" + mailto);
199 return false; /* stop following the link */
202 function createHTTPClient() {
203 // http://developer.apple.com/internet/webcontent/xmlhttpreq.html
204 if (typeof XMLHttpRequest != "undefined")
205 return new XMLHttpRequest();
207 try { return new ActiveXObject("Msxml2.XMLHTTP"); }
209 try { return new ActiveXObject("Microsoft.XMLHTTP"); }
215 function triggerAjaxRequest(url, callback, userdata) {
216 var http = createHTTPClient();
218 activeAjaxRequests += 1;
219 document.animTimer = setTimeout("checkAjaxRequestsState();", 200);
222 http.onreadystatechange
224 // log ("state changed (" + http.readyState + "): " + url);
226 if (http.readyState == 4
227 && activeAjaxRequests > 0) {
229 http.callbackData = userdata;
232 activeAjaxRequests -= 1;
233 checkAjaxRequestsState();
237 activeAjaxRequests -= 1;
238 checkAjaxRequestsState();
239 log("AJAX Request, Caught Exception: " + e.name);
244 http.open("GET", url, true);
251 function checkAjaxRequestsState() {
252 var toolbar = document.getElementById("toolbar");
254 if (activeAjaxRequests > 0
255 && !document.busyAnim) {
256 var anim = document.createElement("img");
257 document.busyAnim = anim;
258 anim.id = "progressIndicator";
259 anim.src = ResourcesURL + "/busy.gif";
260 anim.style.visibility = "hidden;";
261 toolbar.appendChild(anim);
262 anim.style.visibility = "visible;";
264 else if (activeAjaxRequests == 0
265 && document.busyAnim) {
266 document.busyAnim.parentNode.removeChild(document.busyAnim);
267 document.busyAnim = null;
272 function resetSelection(win) {
274 if (win && win.getSelection) {
275 t = win.getSelection().toString();
276 win.getSelection().removeAllRanges();
281 function refreshOpener() {
282 if (window.opener && !window.opener.closed) {
283 window.opener.location.reload();
289 function parseQueryString() {
290 var queryArray, queryDict
291 var key, value, s, idx;
292 queryDict.length = 0;
294 queryDict = new Array();
295 queryArray = location.search.substr(1).split('&');
296 for (var i in queryArray) {
297 if (!queryArray[i]) continue ;
299 idx = s.indexOf("=");
305 key = s.substr(0, idx);
306 value = unescape(s.substr(idx + 1));
309 if (typeof queryDict[key] == 'undefined')
312 queryDict[key] = value;
317 function generateQueryString(queryDict) {
319 for (var key in queryDict) {
324 s = s + key + "=" + escape(queryDict[key]);
329 function getQueryParaArray(s) {
330 if (s.charAt(0) == "?") s = s.substr(1, s.length - 1);
334 function getQueryParaValue(s, name) {
337 t = getQueryParaArray(s);
338 for (var i = 0; i < t.length; i++) {
341 if (s.indexOf(name) != 0)
344 s = s.substr(name.length, s.length - name.length);
345 return decodeURIComponent(s);
350 /* opener callback */
352 function triggerOpenerCallback() {
353 /* this code has some issue if the folder has no proper trailing slash! */
354 if (window.opener && !window.opener.closed) {
357 t = getQueryParaValue(window.location.search, "openerurl=");
358 cburl = window.opener.location.href;
359 if (cburl[cburl.length - 1] != "/") {
360 cburl = cburl.substr(0, cburl.lastIndexOf("/") + 1);
363 window.opener.location.href = cburl;
367 /* selection mechanism */
369 function deselectAll(parent) {
370 for (var i = 0; i < parent.childNodes.length; i++) {
371 var node = parent.childNodes.item(i);
372 if (node.nodeType == 1)
377 function isNodeSelected(node) {
378 var classStr = '' + node.getAttribute('class');
379 var position = classStr.indexOf('_selected', 0);
381 return (position > -1);
384 function acceptMultiSelect(node) {
385 var accept = ('' + node.getAttribute('multiselect')).toLowerCase();
387 return (accept == 'yes');
390 function onRowClick(event) {
391 var node = event.target;
393 if (node.tagName == 'TD')
394 node = node.parentNode;
396 var startSelection = node.parentNode.getSelectedNodes();
397 if (event.shiftKey == 1
398 && (acceptMultiSelect(node.parentNode)
399 || acceptMultiSelect(node.parentNode.parentNode))) {
400 if (isNodeSelected(node) == true) {
406 deselectAll(node.parentNode);
410 if (startSelection != node.parentNode.getSelectedNodes()) {
411 var parentNode = node.parentNode;
412 if (parentNode instanceof HTMLTableSectionElement)
413 parentNode = parentNode.parentNode;
414 var onSelectionChangeEvent = document.createEvent("Event");
415 onSelectionChangeEvent.initEvent("selectionchange", true, true);
416 parentNode.dispatchEvent(onSelectionChangeEvent);
422 var bodyOnClick = "";
423 // var acceptClick = false;
425 function onMenuClick(event, menuId) {
426 var node = event.target;
428 if (document.currentPopupMenu)
429 hideMenu(event, document.currentPopupMenu);
431 var popup = document.getElementById(menuId);
433 var menuTop = event.pageY;
434 var menuLeft = event.pageX;
435 var heightDiff = (window.innerHeight
436 - (menuTop + popup.offsetHeight));
438 menuTop += heightDiff;
440 var leftDiff = (window.innerWidth
441 - (menuLeft + popup.offsetWidth));
443 menuLeft -= popup.offsetWidth;
445 popup.style.top = menuTop + "px;";
446 popup.style.left = menuLeft + "px;";
447 popup.style.visibility = "visible;";
448 setupMenuTarget(popup, node);
450 bodyOnClick = "" + document.body.getAttribute("onclick");
451 document.body.setAttribute("onclick", "onBodyClick(event);");
452 document.currentPopupMenu = popup;
454 event.cancelBubble = true;
455 event.returnValue = false;
460 function setupMenuTarget(menu, target) {
461 menu.menuTarget = target;
462 var menus = document.getElementsByClassName("menu", menu);
463 for (var i = 0; i < menus.length; i++) {
464 menus[i].menuTarget = target;
468 function getParentMenu(node) {
469 var currentNode, menuNode;
473 var menure = new RegExp("(^|\s+)menu(\s+|$)", "i");
475 while (menuNode == null
477 if (menure.test(currentNode.className))
478 menuNode = currentNode;
480 currentNode = currentNode.parentNode;
485 function onBodyClick(event) {
486 document.currentPopupMenu.menuTarget = null;
487 hideMenu(event, document.currentPopupMenu);
488 document.body.setAttribute("onclick", bodyOnClick);
493 function hideMenu(event, menuNode) {
496 // log('hiding menu "' + menuNode.getAttribute('id') + '"');
497 if (menuNode.submenu) {
498 hideMenu(event, menuNode.submenu);
499 menuNode.submenu = null;
502 menuNode.style.visibility = "hidden";
503 if (menuNode.parentMenuItem) {
504 menuNode.parentMenuItem.setAttribute('class', 'submenu');
505 menuNode.parentMenuItem = null;
506 menuNode.parentMenu.setAttribute('onmousemove', null);
507 menuNode.parentMenu.submenuItem = null;
508 menuNode.parentMenu.submenu = null;
509 menuNode.parentMenu = null;
512 var onhideEvent = document.createEvent("Event");
513 onhideEvent.initEvent("hideMenu", false, true);
514 menuNode.dispatchEvent(onhideEvent);
517 function onMenuEntryClick(event, menuId) {
518 var node = event.target;
520 id = getParentMenu(node).menuTarget;
521 // log("clicked " + id + "/" + id.tagName);
526 function parseQueryParameters(url) {
527 var parameters = new Array();
529 var params = url.split("?")[1];
531 var pairs = params.split("&");
532 for (var i = 0; i < pairs.length; i++) {
533 var pair = pairs[i].split("=");
534 parameters[pair[0]] = pair[1];
541 function initLogConsole() {
542 var logConsole = $("logConsole");
544 logConsole.addEventListener("dblclick", onLogDblClick, false);
545 logConsole.innerHTML = "";
546 node = document.getElementsByTagName('body')[0];
547 node.addEventListener("keydown", onBodyKeyDown, true);
551 function onBodyKeyDown(event) {
552 if (event.keyCode == 27) {
554 event.cancelBubble = true;
555 event.returnValue = false;
559 function onLogDblClick(event) {
560 var logConsole = $("logConsole");
561 logConsole.innerHTML = "";
564 function toggleLogConsole(event) {
565 var logConsole = $("logConsole");
566 var display = '' + logConsole.style.display;
567 if (display.length == 0) {
568 logConsole.style.display = 'block;';
570 logConsole.style.display = '';
572 event.cancelBubble = true;
573 event.returnValue = false;
574 event.preventDefault();
577 function log(message) {
580 while (logWindow.opener)
581 logWindow = logWindow.opener;
583 var logConsole = logWindow.document.getElementById("logConsole");
585 logConsole.innerHTML += message + '<br />' + "\n";
588 function backtrace() {
589 var func = backtrace.caller;
590 var str = "backtrace:<br/>";
596 str += " " + func.name;
598 str += " (" + this + ")";
601 str += "[anonymous]\n";
611 function dropDownSubmenu(event) {
612 var node = event.target;
613 var submenu = node.getAttribute("submenu");
614 if (submenu && submenu != "") {
615 var submenuNode = document.getElementById(submenu);
616 var parentNode = getParentMenu(node);
617 if (parentNode.submenu)
618 hideMenu(event, parentNode.submenu);
619 submenuNode.parentMenuItem = node;
620 submenuNode.parentMenu = parentNode;
621 parentNode.submenuItem = node;
622 parentNode.submenu = submenuNode;
624 var menuTop = (node.offsetTop - 2);
626 var heightDiff = (window.innerHeight
627 - (menuTop + submenuNode.offsetHeight));
629 menuTop += heightDiff;
631 var menuLeft = parentNode.offsetWidth - 3;
632 if (window.innerWidth
633 < (menuLeft + submenuNode.offsetWidth
634 + parentNode.cascadeLeftOffset()))
635 menuLeft = -submenuNode.offsetWidth + 3;
637 parentNode.setAttribute('onmousemove', 'checkDropDown(event);');
638 node.setAttribute('class', 'submenu-selected');
639 submenuNode.style.top = menuTop + "px;";
640 submenuNode.style.left = menuLeft + "px;";
641 submenuNode.style.visibility = "visible;";
645 function checkDropDown(event) {
646 var parentMenu = getParentMenu(event.target);
647 var submenuItem = parentMenu.submenuItem;
649 var menuX = event.clientX - parentMenu.cascadeLeftOffset();
650 var menuY = event.clientY - parentMenu.cascadeTopOffset();
651 var itemX = submenuItem.offsetLeft;
652 var itemY = submenuItem.offsetTop - 75;
655 && menuX < itemX + submenuItem.offsetWidth
657 || menuY > (itemY + submenuItem.offsetHeight))) {
658 hideMenu(event, parentMenu.submenu);
659 parentMenu.submenu = null;
660 parentMenu.submenuItem = null;
661 parentMenu.setAttribute('onmousemove', null);
667 function popupSearchMenu(event) {
668 var node = event.target;
670 var menuId = this.getAttribute("menuid");
671 relX = event.pageX - node.cascadeLeftOffset();
672 relY = event.pageY - node.cascadeTopOffset();
674 if (event.button == 0
676 event.cancelBubble = true;
677 event.returnValue = false;
679 if (document.currentPopupMenu)
680 hideMenu(event, document.currentPopupMenu);
682 var popup = document.getElementById(menuId);
683 popup.style.top = node.offsetHeight + "px";
684 popup.style.left = (node.offsetLeft + 3) + "px";
685 popup.style.visibility = "visible";
687 bodyOnClick = "" + document.body.getAttribute("onclick");
688 document.body.setAttribute("onclick", "onBodyClick('" + menuId + "');");
689 document.currentPopupMenu = popup;
693 function setSearchCriteria(event) {
694 searchValue = $("searchValue");
695 searchCriteria = $("searchCriteria");
697 var node = event.target;
698 searchValue.setAttribute("ghost-phrase", node.innerHTML);
699 searchCriteria = node.getAttribute('id');
702 function checkSearchValue(event) {
703 var form = event.target;
704 var searchValue = $("searchValue");
705 var ghostPhrase = searchValue.getAttribute('ghost-phrase');
707 if (searchValue.value == ghostPhrase)
708 searchValue.value = "";
711 function onSearchChange() {
712 log ("onSearchChange()...");
715 function onSearchMouseDown(event) {
716 var superNode = this.parentNode.parentNode.parentNode;
717 relX = (event.pageX - superNode.offsetLeft - this.offsetLeft);
718 relY = (event.pageY - superNode.offsetTop - this.offsetTop);
721 event.cancelBubble = true;
722 event.returnValue = false;
726 function onSearchFocus() {
727 ghostPhrase = this.getAttribute("ghost-phrase");
728 if (this.value == ghostPhrase) {
730 this.setAttribute("modified", "");
735 this.style.color = "#000";
738 function onSearchBlur(event) {
739 var ghostPhrase = this.getAttribute("ghost-phrase");
740 // log ("search blur: '" + this.value + "'");
742 this.setAttribute("modified", "");
743 this.style.color = "#aaa";
744 this.value = ghostPhrase;
745 } else if (this.value == ghostPhrase) {
746 this.setAttribute("modified", "");
747 this.style.color = "#aaa";
749 this.setAttribute("modified", "yes");
750 this.style.color = "#000";
754 function onSearchKeyDown(event) {
756 clearTimeout(this.timer);
758 this.timer = setTimeout("onSearchFormSubmit()", 1000);
761 function initCriteria() {
762 var searchCriteria = $("searchCriteria");
763 var searchValue = $("searchValue");
766 var searchOptions = $("searchOptions");
768 firstOption = searchOptions.childNodes[1];
769 searchCriteria.value = firstOption.getAttribute('id');
770 searchValue.setAttribute('ghost-phrase', firstOption.innerHTML);
771 if (searchValue.value == '') {
772 searchValue.value = firstOption.innerHTML;
773 searchValue.setAttribute("modified", "");
774 searchValue.style.color = "#aaa";
779 /* toolbar buttons */
780 function popupToolbarMenu(event, menuId) {
781 var toolbar = $("toolbar");
782 var node = event.target;
783 if (node.tagName != 'A')
784 node = node.getParentWithTagName("a");
785 node = node.childNodesWithTag("span")[0];
787 if (event.button == 0) {
788 event.cancelBubble = true;
789 event.returnValue = false;
791 if (document.currentPopupMenu)
792 hideMenu(event, document.currentPopupMenu);
794 var popup = document.getElementById(menuId);
795 var top = node.offsetTop + node.offsetHeight - 2;
796 popup.style.top = top + "px";
797 popup.style.left = node.cascadeLeftOffset() + "px";
798 popup.style.visibility = "visible";
800 bodyOnClick = "" + document.body.getAttribute("onclick");
801 document.body.setAttribute("onclick", "onBodyClick('" + menuId + "');");
802 document.currentPopupMenu = popup;
806 /* contact selector */
808 function folderSubscriptionCallback(http) {
809 if (http.readyState == 4) {
810 if (http.status == 204) {
811 if (http.callbackData)
812 http.callbackData["method"](http.callbackData["data"]);
815 window.alert(labels["Unable to subscribe to that folder!"].decodeEntities());
816 document.subscriptionAjaxRequest = null;
819 log ("ajax fuckage");
822 function subscribeToFolder(refreshCallback, refreshCallbackData) {
823 var folderData = refreshCallbackData["folder"].split(":");
824 var username = folderData[0];
825 var folderPath = folderData[1];
826 if (username != UserLogin) {
827 var url = (UserFolderURL + "../" + username
828 + "/" + folderPath + "/subscribe");
829 if (document.subscriptionAjaxRequest) {
830 document.subscriptionAjaxRequest.aborted = true;
831 document.subscriptionAjaxRequest.abort();
833 var rfCbData = { method: refreshCallback, data: refreshCallbackData };
834 document.subscriptionAjaxRequest = triggerAjaxRequest(url,
835 folderSubscriptionCallback,
839 window.alert(labels["You cannot subscribe to a folder that you own!"].decodeEntities());
842 function folderUnsubscriptionCallback(http) {
843 if (http.readyState == 4) {
844 if (http.status == 204) {
845 if (http.callbackData)
846 http.callbackData["method"](http.callbackData["data"]);
849 window.alert(labels["Unable to unsubscribe from that folder!"].decodeEntities());
850 document.unsubscriptionAjaxRequest = null;
854 function unsubscribeFromFolder(folder, refreshCallback, refreshCallbackData) {
855 if (document.body.hasClassName("popup")) {
856 window.opener.unsubscribeFromFolder(folder, refreshCallback, refreshCallbackData);
859 var folderData = folder.split(":");
860 var username = folderData[0];
861 var folderPath = folderData[1];
862 if (username != UserLogin) {
863 var url = (UserFolderURL + "../" + username
864 + "/" + folderPath + "/unsubscribe");
865 if (document.unsubscriptionAjaxRequest) {
866 document.unsubscriptionAjaxRequest.aborted = true;
867 document.unsubscriptionAjaxRequest.abort();
869 var rfCbData = { method: refreshCallback, data: refreshCallbackData };
870 document.unsubscriptionAjaxRequest = triggerAjaxRequest(url,
871 folderUnsubscriptionCallback,
875 window.alert(labels["You cannot unsubscribe from a folder that you own!"].decodeEntities());
879 function listRowMouseDownHandler(event) {
880 event.preventDefault();
884 function initTabs() {
885 var containers = document.getElementsByClassName("tabsContainer");
886 for (var x = 0; x < containers.length; x++) {
887 var container = containers[x];
888 var nodes = container.childNodes[1].childNodes;
891 for (var i = 0; i < nodes.length; i++) {
892 if (nodes[i] instanceof HTMLLIElement) {
896 nodes[i].addEventListener("mousedown", onTabMouseDown, true);
897 nodes[i].addEventListener("click", onTabClick, true);
901 firstTab.addClassName("first");
902 firstTab.addClassName("active");
903 container.activeTab = firstTab;
905 var target = $(firstTab.getAttribute("target"));
906 target.addClassName("active");
910 function initMenusNamed(menuDivNames) {
911 for (var i = 0; i < menuDivNames.length; i++) {
912 var menuDIV = $(menuDivNames[i]);
916 log("menu named '" + menuDivNames[i] + "' not found");
920 function initMenu(menuDIV) {
921 var lis = menuDIV.childNodesWithTag("ul")[0].childNodesWithTag("li");
922 for (var j = 0; j < lis.length; j++)
923 lis[j].addEventListener("mousedown", listRowMouseDownHandler, false);
924 var subMenus = menuDIV.childNodesWithTag("div");
925 for (var i = 0; i < subMenus.length; i++)
926 initMenu(subMenus[i]);
929 function onTabMouseDown(event) {
930 event.cancelBubble = true;
931 event.preventDefault();
934 function openExternalLink(anchor) {
938 function openAclWindow(url) {
939 var w = window.open(url, "aclWindow",
940 "width=300,height=300,resizable=1,scrollbars=1,toolbar=0,"
941 + "location=0,directories=0,status=0,menubar=0"
949 function onTabClick(event) {
950 var node = event.target;
952 var target = node.getAttribute("target");
954 var container = node.parentNode.parentNode;
955 var oldTarget = container.activeTab.getAttribute("target");
956 var content = $(target);
957 var oldContent = $(oldTarget);
959 oldContent.removeClassName("active");
960 container.activeTab.removeClassName("active");
961 container.activeTab = node;
962 container.activeTab.addClassName("active");
963 content.addClassName("active");
968 function enableAnchor(anchor) {
969 var classStr = '' + anchor.getAttribute("class");
970 var position = classStr.indexOf("_disabled", 0);
972 var disabledHref = anchor.getAttribute("disabled-href");
974 anchor.setAttribute("href", disabledHref);
975 var disabledOnclick = anchor.getAttribute("disabled-onclick");
977 anchor.setAttribute("onclick", disabledOnclick);
978 anchor.removeClassName("_disabled");
979 anchor.setAttribute("disabled-href", null);
980 anchor.setAttribute("disabled-onclick", null);
986 function disableAnchor(anchor) {
987 var classStr = '' + anchor.getAttribute("class");
988 var position = classStr.indexOf("_disabled", 0);
990 var href = anchor.getAttribute("href");
992 anchor.setAttribute("disabled-href", href);
993 var onclick = anchor.getAttribute("onclick");
995 anchor.setAttribute("disabled-onclick", onclick);
996 anchor.addClassName("_disabled");
997 anchor.setAttribute("href", "#");
998 anchor.setAttribute("onclick", "return false;");
1005 var hD = "0123456789abcdef";
1006 var h = hD.substr(d & 15, 1);
1010 h = hD.substr(d & 15, 1) + h;
1016 function indexColor(number) {
1022 var colorTable = new Array(1, 1, 1);
1024 var currentValue = number;
1026 while (currentValue)
1028 if (currentValue & 1)
1029 colorTable[index]++;
1037 + d2h((256 / colorTable[2]) - 1)
1038 + d2h((256 / colorTable[1]) - 1)
1039 + d2h((256 / colorTable[0]) - 1));
1045 var onLoadHandler = {
1046 handleEvent: function (event) {
1047 queryParameters = parseQueryParameters('' + window.location);
1048 if (!document.body.hasClassName("popup")) {
1054 configureDragHandles();
1055 configureSortableTableHeaders();
1056 configureLinkBanner();
1057 var progressImage = $("progressIndicator");
1059 progressImage.parentNode.removeChild(progressImage);
1063 function configureSortableTableHeaders() {
1064 var headers = document.getElementsByClassName("sortableTableHeader");
1065 for (var i = 0; i < headers.length; i++) {
1066 var anchor = headers[i].childNodesWithTag("a")[0];
1068 anchor.link = anchor.getAttribute("href");
1070 anchor.addEventListener("click", onHeaderClick, true);
1075 function onLinkBannerClick() {
1076 activeAjaxRequests++;
1077 checkAjaxRequestsState();
1080 function configureLinkBanner() {
1081 var linkBanner = $("linkBanner");
1083 var anchors = linkBanner.childNodesWithTag("a");
1084 for (var i = 0; i < 2; i++) {
1085 anchors[i].addEventListener("mousedown", listRowMouseDownHandler,
1087 anchors[i].addEventListener("click", onLinkBannerClick, false);
1089 if (anchors.length > 3)
1090 anchors[3].addEventListener("click", toggleLogConsole, true);
1094 window.addEventListener("load", onLoadHandler, false);
1097 function configureDragHandles() {
1100 function initializeMenus() {
1103 function onHeaderClick(event) {
1104 window.alert("generic headerClick");
1107 function parent$(element) {
1108 return window.opener.document.getElementById(element);