diff -r 902822492a68 -r fe660c52c48f includes/clientside/static/misc.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/includes/clientside/static/misc.js Wed Jun 13 16:07:17 2007 -0400 @@ -0,0 +1,575 @@ +// Some additional DHTML functions + +function fetch_offset(obj) { + var left_offset = obj.offsetLeft; + var top_offset = obj.offsetTop; + while ((obj = obj.offsetParent) != null) { + left_offset += obj.offsetLeft; + top_offset += obj.offsetTop; + } + return { 'left' : left_offset, 'top' : top_offset }; +} + +function fetch_dimensions(o) { + var w = o.offsetWidth; + var h = o.offsetHeight; + return { 'w' : w, 'h' : h }; +} + +function findParentForm(o) +{ + // Not implemented - someone please let me know how to do this, what I need to do is + // find the first parent
tag above param 'o', not sure how to do it with DOM +} + +function ajaxReverseDNS(o, text) +{ + if(text) var ipaddr = text; + else var ipaddr = o.innerHTML; + rDnsObj = o; + rDnsBannerObj = bannerOn('Retrieving reverse DNS info...'); + ajaxGet(stdAjaxPrefix+'&_mode=rdns&ip='+ipaddr, function() { + if(ajax.readyState == 4) + { + off = fetch_offset(rDnsObj); + dim = fetch_dimensions(rDnsObj); + right = off['left'] + dim['w']; + top = off['top'] + dim['h']; + var thediv = document.createElement('div'); + thediv.className = 'info-box'; + thediv.style.margin = '0'; + thediv.style.position = 'absolute'; + thediv.style.top = top + 'px'; + thediv.style.display = 'none'; + thediv.style.zIndex = getHighestZ() + 2; + thediv.id = 'mdgDynamic_rDnsInfoDiv_'+Math.floor(Math.random() * 1000000); + thediv.innerHTML = 'Reverse DNS:
'+ajax.responseText+' Close'; + var body = document.getElementsByTagName('body'); + body = body[0]; + bannerOff(rDnsBannerObj); + body.appendChild(thediv); + thediv.style.display = 'block'; + left = fetch_dimensions(thediv); + thediv.style.display = 'none'; + left = right - left['w']; + thediv.style.left = left + 'px'; + thediv.style.display = 'block'; + fadeInfoBoxes(); + } + }); +} + +function bannerOn(text) +{ + darken(true); + var thediv = document.createElement('div'); + thediv.className = 'mdg-comment'; + thediv.style.padding = '0'; + thediv.style.marginLeft = '0'; + thediv.style.position = 'absolute'; + thediv.style.display = 'none'; + thediv.style.padding = '4px'; + thediv.style.fontSize = '14pt'; + thediv.id = 'mdgDynamic_bannerDiv_'+Math.floor(Math.random() * 1000000); + thediv.innerHTML = text; + + var body = document.getElementsByTagName('body'); + body = body[0]; + body.appendChild(thediv); + body.style.cursor = 'wait'; + + thediv.style.display = 'block'; + dim = fetch_dimensions(thediv); + thediv.style.display = 'none'; + bdim = { 'w' : getWidth(), 'h' : getHeight() }; + so = getScrollOffset(); + + left = (bdim['w'] / 2) - ( dim['w'] / 2 ); + top = (bdim['h'] / 2) - ( dim['h'] / 2 ) + so; + + thediv.style.top = top + 'px'; + thediv.style.left = left + 'px'; + + thediv.style.display = 'block'; + + return thediv.id; +} + +function bannerOff(id) +{ + e = document.getElementById(id); + if(!e) return; + e.innerHTML = ''; + e.style.display = 'none'; + var body = document.getElementsByTagName('body'); + body = body[0]; + body.style.cursor = 'default'; + enlighten(true); +} + +function disableUnload(message) +{ + if(typeof message != 'string') message = 'You may want to save your changes first.'; + var body = document.getElementsByTagName('body'); + body = body[0]; + body.onbeforeunload='return unescape(\''+escape(message)+'\')'; +} + +function enableUnload() +{ + var body = document.getElementsByTagName('body'); + body = body[0]; + body.onbeforeunload = null; +} + +/** + * Gets the highest z-index of all divs in the document + * @return integer + */ +function getHighestZ() +{ + z = 0; + var divs = document.getElementsByTagName('div'); + for(var i = 0; i < divs.length; i++) + { + if(divs[i].style.zIndex > z) z = divs[i].style.zIndex; + } + return z; +} + +function isKeyPressed(event) +{ + if (event.shiftKey==1) + { + shift = true; + } + else + { + shift = false; + } +} + +function moveDiv(div, newparent) +{ + var backup = div; + var oldparent = div.parentNode; + oldparent.removeChild(div); + newparent.appendChild(backup); +} + +function readCookie(name) {var nameEQ = name + "=";var ca = document.cookie.split(';');for(var i=0;i < ca.length;i++){var c = ca[i];while (c.charAt(0)==' ') c = c.substring(1,c.length);if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);}return null;} +function createCookie(name,value,days){if (days){var date = new Date();date.setTime(date.getTime()+(days*24*60*60*1000));var expires = "; expires="+date.toGMTString();}else var expires = "";document.cookie = name+"="+value+expires+"; path=/";} +function eraseCookie(name) {createCookie(name,"",-1);} + +var busyBannerID; +function goBusy(msg) +{ + if(!msg) msg = 'Please wait...'; + body = document.getElementsByTagName('body'); + body = body[0]; + body.style.cursor = 'wait'; + busyBannerID = bannerOn(msg); +} + +function unBusy() +{ + body = document.getElementsByTagName('body'); + body = body[0]; + body.style.cursor = 'default'; + bannerOff(busyBannerID); +} + +function setAjaxLoading() +{ + if ( document.getElementById('ajaxloadicon') ) + { + document.getElementById('ajaxloadicon').src=scriptPath + '/images/loading.gif'; + } +} + +function unsetAjaxLoading() +{ + if ( document.getElementById('ajaxloadicon') ) + { + document.getElementById('ajaxloadicon').src=scriptPath + '/images/spacer.gif'; + } +} + +/* + * Search boxes + */ + +function buildSearchBoxes() +{ + var divs = document.getElementsByTagName('*'); + var boxes = new Array(); + for ( var i = 0; i < divs.length; i++ ) + { + if ( divs[i].className) + { + if ( divs[i].className.substr(0, 9) == 'searchbox' ) + { + boxes.push(divs[i]); + } + } + } + for ( var i = 0; i < boxes.length; i++ ) + { + if ( boxes[i].className.match(/^searchbox\[([0-9]+)px\]$/) ) + { + var width = boxes[i].className.match(/^searchbox\[([0-9]+)px\]$/); + width = parseInt(width[1]); + } + else + { + var width = 120; + } + createSearchBox(boxes[i], width); + } +} + +function createSearchBox(parent, width) +{ + if ( typeof(parent) != 'object') + { + alert('BUG: createSearchBox(): parent is not an object'); + return false; + } + //parent.style.padding = '0px'; + //parent.style.textAlign = 'center'; + parent.style.width = width + 'px'; + var submit = document.createElement('div'); + submit.onclick = function() { searchFormSubmit(this); }; + submit.className = 'js-search-submit'; + var input = document.createElement('input'); + input.className = 'js-search-box'; + input.value = 'Search'; + input.name = 'q'; + input.style.width = ( width - 28 ) + 'px'; + input.onfocus = function() { if ( this.value == 'Search' ) this.value = ''; }; + input.onblur = function() { if ( this.value == '' ) this.value = 'Search'; }; + parent.appendChild(input); + var off = fetch_offset(input); + var top = off['top'] + 'px'; + var left = ( parseInt(off['left']) + ( width - 24 ) ) + 'px'; + submit.style.top = top; + submit.style.left = left; + parent.appendChild(submit); +} + +function searchFormSubmit(obj) +{ + var input = obj.previousSibling; + if ( input.value == 'Search' || input.value == '' ) + return false; + var p = obj; + while(true) + { + p = p.parentNode; + if ( !p ) + break; + if ( typeof(p.tagName) != 'string' ) + break; + else if ( p.tagName.toLowerCase() == 'form' ) + { + p.submit(); + } + else if ( p.tagName.toLowerCase() == 'body' ) + { + break; + } + } +} + +/* + * AJAX login box (experimental) + */ + +var ajax_auth_prompt_cache = false; +var ajax_auth_mb_cache = false; +var ajax_auth_level_cache = false; + +function ajaxPromptAdminAuth(call_on_ok, level) +{ + if ( typeof(call_on_ok) == 'function' ) + { + ajax_auth_prompt_cache = call_on_ok; + } + if ( !level ) + level = 2; + ajax_auth_level_cache = level; + var loading_win = '
\ +

Fetching an encryption key...

\ +

Not working? Use the alternate login form.

\ +

Please wait...

\ +
'; + ajax_auth_mb_cache = new messagebox(MB_OKCANCEL|MB_ICONLOCK, 'Please enter your username and password to continue.', loading_win); + ajax_auth_mb_cache.onbeforeclick['OK'] = ajaxValidateLogin; + ajaxAuthLoginInnerSetup(); +} + +function ajaxAuthLoginInnerSetup() +{ + ajaxGet(makeUrlNS('Special', 'Login', 'act=getkey'), function() { + if ( ajax.readyState == 4 ) + { + var response = ajax.responseText; + if ( response.substr(0,1) != '{' ) + { + alert('Invalid JSON response from server: ' + response); + return false; + } + response = parseJSON(response); + var form_html = ' \ + \ + \ + \ + \ + \ + \ + \ + \ +
Username: \ +
Password: \ +
\ +
Trouble logging in? Try the full login form.
\ + Did you forget your password?
\ + Maybe you need to create an account.
\ +
\ + \ + \ + '; + ajax_auth_mb_cache.updateContent(form_html); + $('messageBox').object.nextSibling.firstChild.tabindex = '3'; + $('ajaxlogin_user').object.focus(); + $('ajaxlogin_pass').object.onblur = function() { $('messageBox').object.nextSibling.firstChild.focus(); }; + } + }); +} + +function ajaxValidateLogin() +{ + var username,password,auth_enabled,crypt_key,crypt_data,challenge_salt,challenge_data; + username = document.getElementById('ajaxlogin_user'); + if ( !username ) + return false; + username = document.getElementById('ajaxlogin_user').value; + password = document.getElementById('ajaxlogin_pass').value; + auth_enabled = false; + + disableJSONExts(); + + // + // Encryption test + // + + var str = ''; + for(i=0;i

\ + '; + + ajax_auth_mb_cache.updateContent(loading_win); + + ajaxPost(makeUrlNS('Special', 'Login', 'act=ajaxlogin'), 'params=' + json_data, function() { + if ( ajax.readyState == 4 ) + { + var response = ajax.responseText; + if ( response.substr(0,1) != '{' ) + { + alert('Invalid JSON response from server: ' + response); + ajaxAuthLoginInnerSetup(); + return false; + } + response = parseJSON(response); + switch(response.result) + { + case 'success': + if ( typeof(ajax_auth_prompt_cache) == 'function' ) + { + ajax_auth_prompt_cache(response.key); + } + break; + case 'success_reset': + var conf = confirm('You have logged in using a temporary password. Before you can log in, you must finish resetting your password. Do you want to reset your real password now?'); + if ( conf ) + { + var url = makeUrlNS('Special', 'PasswordReset/stage2/' + response.user_id + '/' + response.temppass); + window.location = url; + } + else + { + ajaxAuthLoginInnerSetup(); + } + break; + case 'error': + alert(response.error); + ajaxAuthLoginInnerSetup(); + break; + default: + alert(ajax.responseText); + break; + } + } + }); + + return true; + +} + +// This code is in the public domain. Feel free to link back to http://jan.moesen.nu/ +function sprintf() +{ + if (!arguments || arguments.length < 1 || !RegExp) + { + return; + } + var str = arguments[0]; + var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/; + var a = b = [], numSubstitutions = 0, numMatches = 0; + while (a = re.exec(str)) + { + var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4]; + var pPrecision = a[5], pType = a[6], rightPart = a[7]; + + //alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision); + + numMatches++; + if (pType == '%') + { + subst = '%'; + } + else + { + numSubstitutions++; + if (numSubstitutions >= arguments.length) + { + alert('Error! Not enough function arguments (' + (arguments.length - 1) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).'); + } + var param = arguments[numSubstitutions]; + var pad = ''; + if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1); + else if (pPad) pad = pPad; + var justifyRight = true; + if (pJustify && pJustify === "-") justifyRight = false; + var minLength = -1; + if (pMinLength) minLength = parseInt(pMinLength); + var precision = -1; + if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1)); + var subst = param; + if (pType == 'b') subst = parseInt(param).toString(2); + else if (pType == 'c') subst = String.fromCharCode(parseInt(param)); + else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0; + else if (pType == 'u') subst = Math.abs(param); + else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param); + else if (pType == 'o') subst = parseInt(param).toString(8); + else if (pType == 's') subst = param; + else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase(); + else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase(); + } + str = leftpart + subst + rightPart; + } + return str; +} + +function paginator_goto(parentobj, this_page, num_pages, perpage, url_string) +{ + var height = $(parentobj).Height(); + var width = $(parentobj).Width(); + var left = $(parentobj).Left(); + var top = $(parentobj).Top(); + var left_pos = left + width ; + var top_pos = height + top; + var div = document.createElement('div'); + div.style.position = 'absolute'; + div.style.top = top_pos + 'px'; + div.className = 'question-box'; + div.style.margin = '1px 0 0 2px'; + var vtmp = 'input_' + Math.floor(Math.random() * 1000000); + div.innerHTML = 'Go to page:
»×'; + + var body = document.getElementsByTagName('body')[0]; + body.appendChild(div); + + document.getElementById(vtmp).onkeypress = function(e){if(e.keyCode==13)this.nextSibling.nextSibling.onclick();}; + document.getElementById(vtmp).focus(); + + // fade the div + /* + if(!div.id) div.id = 'autofade_'+Math.floor(Math.random() * 100000); + var from = '#33FF33'; + Fat.fade_element(div.id,30,2000,from,Fat.get_bgcolor(div.id)); + */ + fly_in_bottom(div, false, true); + + var divh = $(div).Width(); + left_pos = left_pos - divh; + div.style.left = left_pos + 'px'; +} + +function paginator_submit(obj, max, perpage, formatstring) +{ + var userinput = obj.previousSibling.previousSibling.value; + userinput = parseInt(userinput); + var offset = ( userinput - 1 ) * perpage; + if ( userinput > max || isNaN(userinput) || userinput < 1 ) + { + new messagebox(MB_OK|MB_ICONSTOP, 'Invalid entry', 'Please enter a page number between 1 and ' + max + '.'); + return false; + } + var url = sprintf(formatstring, String(offset)); + fly_out_top(obj.parentNode, false, true); + window.location = url; +} +