// remote scripting library // (c) copyright 2005 modernmethod, inc var sajax_debug_mode = false; var sajax_request_type = "GET"; var sajax_target_id = ""; var sajax_failure_redirect = ""; function sajax_debug(text) { if (sajax_debug_mode) alert(text); } function sajax_init_object() { sajax_debug("sajax_init_object() called..") var A; var msxmlhttp = new Array( 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'); for (var i = 0; i < msxmlhttp.length; i++) { try { A = new ActiveXObject(msxmlhttp[i]); } catch (e) { A = null; } } if(!A && typeof XMLHttpRequest != "undefined") A = new XMLHttpRequest(); if (!A) sajax_debug("Could not create connection object."); return A; } var sajax_requests = new Array(); function sajax_cancel() { for (var i = 0; i < sajax_requests.length; i++) sajax_requests[i].abort(); } function sajax_do_call(func_name, args) { var i, x, n; var uri; var post_data; var target_id; sajax_debug("in sajax_do_call().." + sajax_request_type + "/" + sajax_target_id); target_id = sajax_target_id; if (typeof(sajax_request_type) == "undefined" || sajax_request_type == "") sajax_request_type = "GET"; uri = "/ideas/browser.js.php"; if (sajax_request_type == "GET") { if (uri.indexOf("?") == -1) uri += "?rs=" + escape(func_name); else uri += "&rs=" + escape(func_name); uri += "&rst=" + escape(sajax_target_id); uri += "&rsrnd=" + new Date().getTime(); for (i = 0; i < args.length-1; i++) uri += "&rsargs[]=" + escape(args[i]); post_data = null; } else if (sajax_request_type == "POST") { post_data = "rs=" + escape(func_name); post_data += "&rst=" + escape(sajax_target_id); post_data += "&rsrnd=" + new Date().getTime(); for (i = 0; i < args.length-1; i++) post_data = post_data + "&rsargs[]=" + escape(args[i]); } else { alert("Illegal request type: " + sajax_request_type); } x = sajax_init_object(); if (x == null) { if (sajax_failure_redirect != "") { location.href = sajax_failure_redirect; return false; } else { sajax_debug("NULL sajax object for user agent:\n" + navigator.userAgent); return false; } } else { x.open(sajax_request_type, uri, true); // window.open(uri); sajax_requests[sajax_requests.length] = x; if (sajax_request_type == "POST") { x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1"); x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); } x.onreadystatechange = function() { if (x.readyState != 4) return; sajax_debug("received " + x.responseText); var status; var data; var txt = x.responseText.replace(/^\s*|\s*$/g,""); status = txt.charAt(0); data = txt.substring(2); if (status == "") { // let's just assume this is a pre-response bailout and let it slide for now } else if (status == "-") alert("Error: " + data); else { if (target_id != "") document.getElementById(target_id).innerHTML = eval(data); else { try { var callback; var extra_data = false; if (typeof args[args.length-1] == "object") { callback = args[args.length-1].callback; extra_data = args[args.length-1].extra_data; } else { callback = args[args.length-1]; } callback(eval(data), extra_data); } catch (e) { sajax_debug("Caught error " + e + ": Could not eval " + data ); } } } } } sajax_debug(func_name + " uri = " + uri + "/post = " + post_data); x.send(post_data); sajax_debug(func_name + " waiting.."); delete x; return true; } // wrapper for get_list function x_get_list() { sajax_do_call("get_list", x_get_list.arguments); } // wrapper for get_num_pics function x_get_num_pics() { sajax_do_call("get_num_pics", x_get_num_pics.arguments); } // wrapper for get_textfile function x_get_textfile() { sajax_do_call("get_textfile", x_get_textfile.arguments); } // wrapper for addtowiki function x_addtowiki() { sajax_do_call("addtowiki", x_addtowiki.arguments); } String.prototype.pad = function(c,l) { if (this.length>=l) return this; var s = this; while(s.lengthen.getHours()) { var m = monthName(st.getMonth()); return new Array( timeclockstr(start) , st.getDate() + '-' + en.getDate() + ' ' + m + ' ' + y , timeclockstr(end) ); } else { var m = monthName(st.getMonth()); return new Array( st.getDate() + '/' + m , m + ' ' + y , en.getDate() + '/' + m ); } } else if (st.getMonth()==en.getMonth()-1) // STUPID; SAME YEAR: || st.getMonth()==11&&en.getMonth()==0) { return new Array( st.getDate() , monthName(st.getMonth()) + '/' + monthName(en.getMonth()) + ' ' + y , en.getDate() ); } else { return new Array( st.getDate() , monthName(st.getMonth()) + '-' + monthName(en.getMonth()) + ' ' + y , en.getDate() ); } } else { var a = st.getYear()<1900?1900:0; return new Array( st.getDate() + ' ' + monthName(st.getMonth()) , (st.getYear()+a) + '-' + (en.getYear()+a) , en.getDate() + ' ' + monthName(en.getMonth())); } } // DOM // function getElementLeft(elem) { if (!elem) return 0; if (document.getBoxObjectFor) return document.getBoxObjectFor(elem).x; else return elem.getBoundingClientRect().left; } function getElementTop(elem) { if (!elem) return 0; var curtop = 0; if (elem.offsetParent) { while (elem.offsetParent) { curtop += elem.offsetTop elem = elem.offsetParent; } } else if (elem.y) curtop += elem.y; return curtop; } function toggleDisplay(id) { var e = document.getElementById(id); if (!e) return false; e.style.display = e.style.display=='block'?'none':'block'; return true; } /* retrieves the value of 'page' in url */ function urlPagename() { var str = document.location.search; var i = str.indexOf('page='); if (i<0) return false; str = str.substr(i+5); i = str.indexOf('&'); if (i>0) str = str.substr(0,i); return str; } /* creates html elements based on input of style: { tag : [TAG], attributes : { [attr] : [value], ... }, children : new Array( ... ) } also, if specified with 'fetch : [NAME]' element, the resulting associative array will contain that specific element under the reference [NAME]. (i.e. res = createHtmlElements(...) gives you res[[NAME]] for each fetch'ed element). the returning value will containt the top element under '_t' reference. */ /* EXAMPLE: var elements = createHtmlElements( { tag : 'table', attributes : { 'width' : '100%', 'height' : '100%' }, children : new Array( { tag : 'tr', attributes : { 'height' : '100%', 'valign' : 'bottom' }, children : new Array( { tag : 'td', attributes : { 'align' : 'left' }, fetch : 'start' }, { tag : 'td', attributes : { 'align' : 'right' }, fetch : 'end' } ) } ) } ); l.appendChild(elements['_t']); elements['start'].innerHTML = "start"; elements['end'].innerHTML = "end"; */ function createHtmlElements( node ) { var e = document.createElement(node.tag); for(attr in node.attributes) { var value = node.attributes[attr]; e.setAttribute(attr,value); } var r = new Object(); if (node.children) { for(var i=0;i // document.body
..start..
..end
// histogram
...
... */ browser.body = document.createElement('div'); browser.body.setAttribute('id','browser'); browser.body.style.display = "block"; // settings menu var topmenu = document.createElement('div'); topmenu.setAttribute('id','browserTopMenu'); // topmenu.innerHTML = "settingsclose"; topmenu.innerHTML = "settingsclose"; var settings = document.createElement('div'); settings.setAttribute('id','browserSettings'); settings.innerHTML = "Animate:
"; browser.body.appendChild(topmenu); browser.body.appendChild(settings); // images var l = document.createElement('div'); l.setAttribute('id','browserImages'); browser.body.appendChild(l); l.style.display = "block"; l.style.width = "100%"; l.style.height = "100%"; browser.imagesBody = l; // text var st = document.createElement('div'); st.style.color = '#fff'; st.style.fontSize = '12pt'; st.style.fontFamily = 'Arial, Sans-Serif'; st.style.position = 'absolute'; st.style.top = '1.2em'; st.innerHTML = "start"; l.appendChild(st); var en = document.createElement('div'); en.style.color = '#fff'; en.style.fontSize = '12pt'; en.style.fontFamily = 'Arial, Sans-Serif'; en.style.position = 'absolute'; en.style.top = '1.2em'; en.style.right = '0px'; en.innerHTML = "end"; l.appendChild(en); var cen = document.createElement('div'); cen.style.color = '#fff'; cen.style.fontSize = '12pt'; cen.style.fontFamily = 'Arial, Sans-Serif'; cen.style.position = 'absolute'; cen.style.top = '1.2em'; cen.style.width = '100%'; cen.style.textAlign = 'center'; l.appendChild(cen); browser.fields.start = st; browser.fields.end = en; browser.fields.center = cen; // timeline var timelineBody = document.createElement("div"); timelineBody.setAttribute('id','browserTimeline'); browser.body.appendChild(timelineBody); browser.timeline.body = timelineBody; var days = Math.ceil((browser.timeline.full.end - browser.timeline.full.start)/(24*60*60)); awareNumDays = days; for (var i=0;imax_y) y = min_y; browser.objects[item['objectid']].objdiv = objdiv; browser.objects[item['objectid']].img = img; img.setAttribute('src','browser_thumb.php?objectid=' + item['objectid']); } } browser.input_position_y = y; // if (new_object) browser.render(); browser.updateTimer = setTimeout(browser.update, 60*1000); }, preview : { objectindex : -1, lastobjectindex : -2, body : null, info : null, content : null, img : null, create : function() { if (browser.preview.body) return true; /*
#browserPreview */ var div = document.createElement('div'); div.setAttribute('id','browserPreview'); div.style.display = 'none'; // div.onmousedown = browser.preview.hide; var info = document.createElement('div'); info.setAttribute('id','browserPreviewInfo'); div.appendChild(info); var content = document.createElement('div'); content.setAttribute('id','browserPreviewContent'); content.onmousedown = browser.preview.hide; div.appendChild(content); browser.body.appendChild(div); browser.preview.body = div; browser.preview.info = info; browser.preview.content = content; }, open : function() { if (browser.preview.objectindex==browser.preview.lastobjectindex) { browser.preview.body.style.display = 'block'; return false; } browser.preview.lastobjectindex = browser.preview.objectindex; browser.preview.create(); browser.preview.body.style.display = 'block'; switch(browser.objects[browser.preview.objectindex].type) { case "Text": browser.preview.content.style.width = browser.body.offsetWidth - 222; x_get_textfile( browser.preview.objectindex, browser.preview.get_textfile_cb ); break; case "Video": case "Audio": var width = browser.body.offsetWidth - 222, height = browser.body.offsetHeight; var url = 'tiki-download_file.php?fileId=' + browser.objects[browser.preview.objectindex]['fileid']; browser.preview.content.innerHTML = " "; break; case "Image": var div = browser.preview.content; div.innerHTML = ""; var img = document.createElement('img'); div.appendChild(img); img.onclick = browser.preview.hide; var url = 'show_image.php?id=' + browser.objects[browser.preview.objectindex]['imageid']; img.setAttribute( 'src', url ); break; } // fix info var obj = browser.objects[browser.preview.objectindex]; var html = ""; if (obj['user']) html += "User: " + obj['user'] + "
"; if (obj['time']) html += "Time: " + obj['time'] + "
"; if (html.length>0) html += "
"; if (urlPagename()) html += "Add to wiki page"; browser.preview.info.innerHTML = html; return false; }, hide : function(evt) { if (!evt) evt = event; if (evt.button<1) { browser.preview.body.style.display = 'none'; document.body.oncontextmenu = function() { return false; }; } evt.cancelBubble = true; if (evt.stopPropagation) evt.stopPropagation(); return false; }, get_textfile_cb : function(content) { browser.preview.content.innerHTML = content; }, addToWikipage : function() { var pagename = urlPagename(); x_addtowiki(pagename,browser.preview.objectindex, browser.preview.addtowiki_cb); // index is actually id }, addtowiki_cb : function(z) { alert(z); browser.pageedited = true; } }, drag : { dragging : false, target : null, moved : true, offset : {x:0,y:0} }, objectDrag : function(evt, index) // index == object index { // disable automatic image dragging (e.g. copying) if (evt.preventDefault) evt.preventDefault(); // mozilla evt.returnValue = false; // right mouse button if (evt.button>1) return true; // shift key if (evt.shiftKey) return true; // ctrl key if (evt.ctrlKey) return true; switch( evt.type ) { case "mousedown": eval("document.onmouseup = function(evt) { if (!evt) evt=event; browser.objectDrag(evt," + index + "); }"); eval("document.onmousemove = function(evt) { if (!evt) evt=event; browser.objectDrag(evt," + index + "); }"); browser.drag.taget = evt.target?evt.target:evt.srcElement; var left = getElementLeft( browser.objects[index].objdiv ); var top = getElementTop( browser.objects[index].objdiv ); browser.drag.offset.x = (evt.clientX?evt.clientX:evt.pageX)-left; browser.drag.offset.y = (evt.clientY?evt.clientY:evt.pageY)-top; browser.drag.dragging = true; browser.drag.moved = false; evt.cancelBubble = true; if (evt.stopPropagation) evt.stopPropagation(); break; case "mouseup": document.onmouseup = null; document.onmousemove = null; browser.drag.dragging = false; if (!browser.drag.moved) { browser.preview.objectindex = index; browser.preview.open(); } evt.cancelBubble = true; if (evt.stopPropagation) evt.stopPropagation(); break; case "mousemove": var top = getElementTop(browser.body); var clientY = evt.clientY?evt.clientY:evt.pageY; // browser.objects[index].objdiv.style.top = clientY-15 + 'px'; browser.objects[index].objdiv.style.top = clientY-browser.drag.offset.y + 'px'; browser.drag.moved = true; evt.cancelBubble = true; if (evt.stopPropagation) evt.stopPropagation(); break; default: return true; } return false; }, render : function() { // var bw = browser.body.offsetWidth; // var bw = browser.imagesBody.offsetWidth; var bw = browser.imagesBody.offsetWidth-120; var tl = browser.timeline.visible.end-browser.timeline.visible.start; var bbb = false; for (var index in browser.objects) { var object = browser.objects[index]; if (object['timestamp']bw+120) // both object.objdiv.offsetWidth and object.img.width is zero on IE. offsetWidth is 0 on ff { object.objdiv.style.display='none'; } else { object.objdiv.style.display='block'; object.objdiv.style.left = x + 'px'; } } var ts = timeLCSstr(browser.timeline.visible.start, browser.timeline.visible.end); browser.fields.start.innerHTML = ts[0]; //timetostr(browser.timeline.visible.start); browser.fields.end.innerHTML = ts[2]; //timetostr(browser.timeline.visible.end); browser.fields.center.innerHTML = ts[1]; //timeLCSstr(browser.timeline.visible.start,browser.timeline.visible.end); }, timeline : { body : null, selection : null, // html elements for visual representation numpics : null, update : function() { x_get_num_pics( browser.timeline.full.start, browser.timeline.full.end, browser.timeline.update_cb ); }, update_cb : function(z) { var list; eval(z); browser.timeline.numpics = list; browser.timeline.render(); }, renderSelection : function() { if (!browser.timeline.selection) return false; var x1 = getElementLeft(browser.timeline.body) + (browser.timeline.body.offsetWidth*(browser.timeline.visible.start-browser.timeline.full.start))/(browser.timeline.full.end-browser.timeline.full.start); var x2 = getElementLeft(browser.timeline.body) + (browser.timeline.body.offsetWidth*(browser.timeline.visible.end-browser.timeline.full.start))/(browser.timeline.full.end-browser.timeline.full.start); browser.timeline.selection.style.left = parseInt(x1) + 'px'; browser.timeline.selection.style.width = parseInt(x2-x1) + 'px'; }, render : function() { if (!browser.timeline.numpics) return; var days = Math.ceil((browser.timeline.full.end - browser.timeline.full.start)/(24*60*60)); var left = getElementLeft(browser.timeline.body); var w = browser.timeline.body.offsetWidth / days; var x1 = left,x2; var date = new Date(); date.setTime(browser.timeline.full.start*1000); date.setDate(date.getDate()-1); for (var i=0;ibrowser.zoomcontrol.selector.startx) { browser.zoomcontrol.selector.obj.style.left = browser.zoomcontrol.selector.startx + 'px'; browser.zoomcontrol.selector.obj.style.width = (x-browser.zoomcontrol.selector.startx) + 'px'; } else { browser.zoomcontrol.selector.obj.style.left = x + 'px'; browser.zoomcontrol.selector.obj.style.width = (browser.zoomcontrol.selector.startx-x) + 'px'; } }, stop : function() { if (!browser.zoomcontrol.selector.obj) return; browser.zoomcontrol.selector.obj.style.display = 'none'; } }, down : function(evt) { if (browser.drag.dragging) return true; if (!evt) evt = event; // disable automatic image dragging (e.g. copying) if (evt.preventDefault) evt.preventDefault(); // mozilla : doesn't really seem to be needed evt.returnValue = false; if (evt.button>1 || evt.ctrlKey) // right mouse button { if (evt.type!="mousedown") return false; var tl = browser.timeline.pop() if (tl) { browser.zoomcontrol.animation.start( tl.start, tl.end, 10 ); } else { var left = getElementLeft( browser.body ); var width = browser.body.offsetWidth; var x = evt.clientX?evt.clientX:evt.pageX; var p = /*parseInt*/(browser.timeline.visible.start + (x-left)*(browser.timeline.visible.end - browser.timeline.visible.start)/width); browser.zoomcontrol.animation.start( /*parseInt*/( p + 1.5*(browser.timeline.visible.start-p) ), /*parseInt*/( p + 1.5*(browser.timeline.visible.end-p) ), 10 ); } browser.render(); return false; } switch(evt.type) { case "mousedown": browser.body.onmouseup = browser.zoomcontrol.down; browser.body.onmousemove = browser.zoomcontrol.down; var x = evt.clientX?evt.clientX:evt.pageX; var y = evt.clientY?evt.clientY:evt.pageY; browser.zoomcontrol.x = x; browser.zoomcontrol.y = y; browser.zoomcontrol.oldstart = browser.timeline.visible.start; browser.zoomcontrol.oldend = browser.timeline.visible.end; browser.zoomcontrol.selector.start(x,y); break; case "mouseup": browser.body.onmouseup = null; browser.body.onmousemove = null; var left = getElementLeft( browser.body); var width = browser.body.offsetWidth; var x1 = browser.zoomcontrol.x; var x2 = evt.clientX?evt.clientX:evt.pageX; browser.zoomcontrol.selector.stop(); if (x1>x2) { var tmp = x1; x1 = x2; x2 = tmp; } if (x2-x1>5) { browser.timeline.pushcurrent(); browser.zoomcontrol.animation.start( /*parseInt*/(browser.timeline.visible.start + (x1-left)*(browser.timeline.visible.end-browser.timeline.visible.start)/width), /*parseInt*/(browser.timeline.visible.start + (x2-left)*(browser.timeline.visible.end-browser.timeline.visible.start)/width), 10 ); } // else ignore break; case "mousemove": browser.zoomcontrol.selector.change( evt.clientX?evt.clientX:evt.pageX ); break; } return true; }, animation : { from : { start : 0, end : 0 }, to : { start : 0, end : 0 }, t : 0, steps : 10, timerid : 0, start : function(start,end, steps) { browser.zoomcontrol.animation.from.start = browser.timeline.visible.start; browser.zoomcontrol.animation.from.end = browser.timeline.visible.end; browser.zoomcontrol.animation.to.start = start; browser.zoomcontrol.animation.to.end = end; browser.zoomcontrol.animation.steps = steps?steps:10; // default 10 steps browser.zoomcontrol.animation.t = 0; browser.zoomcontrol.animation.tick(); }, tick : function() { if (!browser.settings.animate) { browser.timeline.visible.start = browser.zoomcontrol.animation.to.start; browser.timeline.visible.end = browser.zoomcontrol.animation.to.end; browser.timeline.renderSelection(); browser.render(); browser.update(); return true; } if (browser.zoomcontrol.animation.timerid) { clearTimeout( browser.zoomcontrol.animation.timerid ); browser.zoomcontrol.animation.timerid = 0; } var fs = browser.zoomcontrol.animation.from.start; var fe = browser.zoomcontrol.animation.from.end; var ts = browser.zoomcontrol.animation.to.start; var te = browser.zoomcontrol.animation.to.end; var t = browser.zoomcontrol.animation.t; var steps = browser.zoomcontrol.animation.steps; // browser.timeline.visible.start = parseInt(fs + (t-steps)*(ts-fs)/steps); // browser.timeline.visible.end = parseInt(fe + (t-steps)*(te-fe)/steps); browser.timeline.visible.start = Math.round(ts - (t-steps)*(fs-ts)/steps); browser.timeline.visible.end = Math.round(te - (t-steps)*(fe-te)/steps); browser.render(); if (t