// All code not otherwise noted is written by Jacob Angel Munoz < me@poxix.com > (c) 2009 - 2010 // Poxix Core V0.7.1 - 'protopox Beta' Jun/6/2010 // Released under GPL License // You know the rules... // constants var contentPan; var leftPanel; var rightPanel; var topPanel; var bottomPanel; var contentTable; var width; var height; var ResizeArray = new Array(); var autoResize = new Array(); var inColorTransit = false; var EventArray = Array(); var browser; var resizeSpeed=20; var resizeConcede=resizeSpeed+5; var resizeDelay=40; var thispage; var internalDebug='#v0.7.1\n#x:begin\n'; var _dom=document.all?3:(document.getElementById?1:(document.layers?2:0)); // core functions function $(e) { try {return document.getElementById(e);} catch (exc) {return false;} } function serialize(_obj) { if (typeof _obj.toSource !== 'undefined' && typeof _obj.callee === 'undefined') { return _obj.toSource();} switch (typeof _obj) { case 'number': case 'boolean': case 'function': return _obj; break; case 'string': return '\'' + _obj + '\''; break; case 'object': var str; if (_obj.constructor === Array || typeof _obj.callee !== 'undefined') { str = '['; var i, len = _obj.length; for (i = 0; i < len-1; i++) { str += serialize(_obj[i]) + ','; } str += serialize(_obj[i]) + ']'; } else { str = '{'; var key; for (key in _obj) { str += key + ':' + serialize(_obj[key]) + ','; } str = str.replace(/\,$/, '') + '}'; } return str; break; default: return 'UNKNOWN'; break; } } function initializeComponents() { window.onresize=doAutoResize; getDimensions(); contentPan = $('contentPanel'); contentTable = $('contentTable'); leftPanel=$('leftPanel'); rightPanel=$('rightPanel'); topPanel=$('topPanel'); bottomPanel=$('bottomPanel'); hookEvent('body','mousewheel',mouseWheel); hookEvent('body','mousemove',movers); detectSpeed(); } function detectSpeed() { var ts = new Date().getTime(); try { for (var s = 0; s<200; s++) { contentPan.style.background='rgb(0,0,1)'; contentPan.style.background='rgb(0,0,0)'; var aa = getOpacity(contentPan); setOpacity(contentPan,aa-1); setOpacity(contentPan,aa); } var xts = new Date().getTime(); var xdf = xts - ts; bottomPanel.innerHTML=(xts+" - "+ts+" = "+xdf); } catch (ex) {alert(ex.description);} } // event handlers // cited from online source, temporary usage only - will find better code later. function hookEvent(element, eventName, callback) { if(typeof(element) == "string") element = $(element); if(element == null) return; if(element.addEventListener) { if(eventName == 'mousewheel') element.addEventListener('DOMMouseScroll', callback, false); element.addEventListener(eventName, callback, false); } else if(element.attachEvent) element.attachEvent("on" + eventName, callback); } function unhookEvent(element, eventName, callback) { if(typeof(element) == "string") element = $(element); if(element == null) return; if(element.removeEventListener) { if(eventName == 'mousewheel') element.removeEventListener('DOMMouseScroll', callback, false); element.removeEventListener(eventName, callback, false); } else if(element.detachEvent) element.detachEvent("on" + eventName, callback); } // mousey stuff function mouseWheel(e) { //forwards mouse wheel to center panel e = e ? e : window.event; var wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40; contentPan.scrollTop = contentPan.scrollTop - (wheelData*10); } // Div Dragging - rewritten and made cross-platform by Jacob Munoz // Google "Draggable Div" Surren @ diffused Reality // http://www.diffusedreality.com/content.html var clicked = false; var mouseX; var mouseY; var mouseElement; var mouseXo; var mouseYo; function clickser(event, ele_name) { clicked = true; mouseElement = ele_name; if(event.clientX || event.clientY) { clickX=event.clientX; clickY=event.clientY; } else { clickX=event.offsetX; clickY=event.offsetY; } itemX = $(mouseElement).style.left; itemY = $(mouseElement).style.top; arX = itemX.replace(/px/,''); arY = itemY.replace(/px/,''); mouseXo = clickX - arX; mouseYo = clickY - arY; $(mouseElement).className = 'drag'; $(mouseElement).style.cursor = 'move'; } function movers(event) { if(clicked == true) { if(event.clientX || event.clientY) { mouseX=event.clientX - mouseXo; mouseY=event.clientY - mouseYo; } else { mouseX=event.offsetX - mouseXo; mouseY=event.offsetY - mouseYo; } $(mouseElement).className = 'drag'; $(mouseElement).style.top = mouseY +'px'; $(mouseElement).style.left = mouseX +'px'; } } function unclicks() { clicked = false; $(mouseElement).style.top = mouseY +'px'; $(mouseElement).style.left = mouseX +'px'; $(mouseElement).style.className = 'regular'; $(mouseElement).style.cursor = 'auto'; } //temporary use only - will be rewritten to server-side application FTPLogin = function(username,password,directory,server,id) { if (username && password && server) { if (directory) { directory = "./" + directory; var ftpsite = "ftp://" + username + ":" + password + "@" + server + "/" + directory; $(id).src = ftpsite; $(id).width='500px'; $(id).height='300px'; } else { var ftpsite = "ftp://" + username + ":" + password + "@" + server; $(id).src = ftpsite; $(id).width='500px'; $(id).height='300px'; } } else { alert("Please enter your username, password, and FTP server's address."); } }; // ajax functions function makeDelayedRequest(url, parameters, doMode, retries,delay) { setTimeout("makePOSTRequest('"+url+"','"+parameters+"',"+doMode+","+retries+");",delay); } // most important ajax function of all! function makePOSTRequest(url, parameters, doMode, retries) { var h_r = false; if (window.XMLHttpRequest) { h_r = new XMLHttpRequest(); if (h_r.overrideMimeType) h_r.overrideMimeType('text/html'); } else if (window.ActiveXObject) { try {h_r = new ActiveXObject("Msxml2.XMLHTTP");} catch (e) { try { h_r = new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {} } } if (!h_r) { alert('You need to update your browser or allow AJAX calls to view this site.'); return false; } if (doMode=='html') h_r.onreadystatechange = function () {fillContents(h_r,contentPan,url,parameters,doMode,retries);}; else if (doMode=='js') h_r.onreadystatechange = function() {executeContents(h_r,url,parameters,doMode,retries);} else if ((typeof doMode)=='object') h_r.onreadystatechange = function () {fillContents(h_r,doMode,url,parameters,doMode,retries);}; else if ((typeof doMode)=='function') h_r.onreadystatechange = function () { result=false;try{doMode(h_r);result=true ;} catch(e){} if ((h_r.readyState == 4)&&(h_r.status == 200)) ajaxFlush(h_r,result);}; else alert('ouch'); h_r.open('POST', url, true); h_r.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); h_r.setRequestHeader("Content-length", parameters.length); h_r.setRequestHeader("Connection", "close"); h_r.send(parameters); EventArray.push(h_r); } function fillContents(ajaxObj,ajaxTarget,url,parameters,doMode,retries) { result=false; if (ajaxObj.readyState == 4) { if (ajaxObj.status == 200) { // sync experiment - future feature if (!syncAjax(ajaxObj)) return; ajaxTarget.innerHTML = ajaxObj.responseText; result=true; } else { retries = retries - 1; if (retries >= 0) makePOSTRequest(url,parameters,doMode,retries); } ajaxFlush(ajaxObj,result); } } function executeContents(ajaxObj,url,parameters,doMode,retries) { result = false; if (ajaxObj.readyState == 4) { if (ajaxObj.status == 200) { // sync experiment - future feature if (!syncAjax(ajaxObj)) return; try { eval( ajaxObj.responseText ); result = true; } catch (e) {} //{alert(e);} } else { retries = retries - 1; if (retries >= 0) makePOSTRequest(url,parameters,doMode,retries); } ajaxFlush(ajaxObj,result); } } function ajaxFlush(ajaxObj,result) { for (var fl in EventArray) if (EventArray[fl] == ajaxObj) EventArray[fl]=result;//EventArray.splice(o,1); } function ajaxFormGet(obj) { var poststr = "mytextarea1=" + encodeURI( "value" ) + "&mytextarea2=" + encodeURI( "value" ); makePOSTRequest('index.php', poststr,'html'); } function syncAjax(ajaxObj) { // still a work in progress --- if (EventArray[0] != ajaxObj) { for (var o in EventArray) if (EventArray[o] == ajaxObj) setTimeout("EventArray["+o+"].onreadystatechange();",500); return false; } else return true; } function pageTransition(newPage,pageTransitionDelay) { thispage=newPage; getOpacity(contentPan); startTransition('a',10,0,0,'contentPanel'); //makeDelayedRequest('cgi-bin/html.php', 'doc='+newPage, function(ac) { if ((ac.status==200)&&(ac.readyState==4)) {contentPan.innerHTML=ac.responseText; startTransition('a',4,100,5,'contentPanel');} },100 ,pageTransitionDelay); makePOSTRequest('cgi-gin/js.php', 'doc='+newPage, 'js',100); } // resizing function getDimensions() { width = (typeof window.innerWidth != 'undefined' ? window.innerWidth : document.body.offsetWidth); if( typeof( window.innerWidth ) == 'number' ) height = window.innerHeight; else if( document.documentElement && document.documentElement.clientHeight ) height = document.documentElement.clientHeight; else if( document.body && document.body.clientHeight ) height = document.body.clientHeight; } function resize(heit,widt,id) { if (ResizeArray[id]==true) {setTimeout("resize("+heit+","+widt+",'"+id+"');",1000);} else {resizeTo(heit,widt,id);} } function resizeTo(heit,widt,id) { ResizeArray[id]=true; continu = true; try { d = $(id); wid = d.offsetWidth; hgt = d.offsetHeight; if ((wid > widt) && (wid > widt + resizeSpeed)) { wid = wid - resizeSpeed; d.style.width = wid + "px"; } if ((wid < widt) && (wid < widt - resizeSpeed)) { wid = wid + resizeSpeed; d.style.width = wid + "px"; } if ((hgt > heit) && (hgt > heit + resizeSpeed)) { hgt = hgt - resizeSpeed; d.style.height = hgt + "px"; } if ((hgt < heit) && (hgt < heit - resizeSpeed)) { hgt = hgt + resizeSpeed; d.style.height = hgt + "px"; } if (((wid > widt - resizeConcede) && (wid < widt + resizeConcede)) && ((hgt > heit - resizeConcede ) && (hgt < heit + resizeConcede))) { continu = false; d.style.height= heit+"px"; d.style.width=widt+"px";} } catch (e) {continu=false;} if (continu) setTimeout("resizeTo(" + heit + "," + widt + ",'" + id + "')",resizeDelay); else { delete ResizeArray[id]; try { resizeDone(); } catch (e) {} } } function doAutoResize() { if (ResizeArray['contentPanel']) {setTimeout('doAutoResize();',500);} else { getDimensions(); arh=false;arw=false; if (autoResize['contentPanel']==undefined) {arh=false; arw=false;} else { if (autoResize['contentPanel']=='h') arh=true; if (autoResize['contentPanel']=='w') arw=true; if (autoResize['contentPanel']=='hw' || autoResize['contentPanel']=='wh' ) {arh=true;arw=true;} } if (arh==true && arw==true) { newhgt = (((height-100)-$('topPanel').offsetHeight)-$('bottomPanel').offsetHeight); newwid = (((width-100)-$('leftPanel').offsetWidth)-$('rightPanel').offsetWidth); if (newhgt<0) newhgt = 0; if (newwid<0) newwid = 0; resize(newhgt ,newwid ,'contentPanel'); } else if (arh==true) { newwid = contentPan.offsetWidth; newhgt = (((height-100)-$('topPanel').offsetHeight)-$('bottomPanel').offsetHeight); if (newhgt<0) newhgt = 0; if (newwid<0) newwid = 0; resize(newhgt ,newwid ,'contentPanel'); } else if (arw==true) { newhgt = contentPan.offsetHeight; newwid = (((width-100)-$('leftPanel').offsetWidth)-$('rightPanel').offsetWidth); if (newhgt<0) newhgt = 0; if (newwid<0) newwid = 0; resize(newhgt ,newwid ,'contentPanel'); } } } // color/alpha transition function startTransition(component,increment,target,delay,id) { var d = $(id); var dcolor = d.style.backgroundColor; var dca = dcolor.replace(/rgb\(|\)/g, "").split(","); var xr = parseInt(dca[0], 10); if (isNaN(xr)) xr = HTR(dcolor); var xg = parseInt(dca[1], 10); if (isNaN(xg)) xg = HTG(dcolor); var xb = parseInt(dca[2], 10); if (isNaN(xb)) xb = HTB(dcolor); switch(component) { case 'r': if (xr > target) increment = -increment; if (xr==target) return; break; case 'b': if (xb > target) increment = -increment; if (xb==target) return; break; case 'g': if (xg > target) increment = -increment; if (xg==target) return; break; case 'a': if (getOpacity(d) > target) increment = -increment; if (getOpacity(d)==target) return; break; } Transition(component,increment,target,delay,0,id); } function Transition(component,inc,target,delay,unlock,id){ inColorTransit = true; if (unlock<255) { unlock=unlock+1; var d = $(id); var dcolor = d.style.backgroundColor; var dca = dcolor.replace(/rgb\(|\)/g, "").split(","); var r = parseInt(dca[0], 10); if (isNaN(r)) r = HTR(dcolor); var g = parseInt(dca[1], 10); if (isNaN(g)) g = HTG(dcolor); var b = parseInt(dca[2], 10); if (isNaN(b)) b = HTB(dcolor); var a; var compval; switch (component) { case 'r': r = r + inc; compval = r; d.style.background='rgb(' + r + ',' + g + ',' + b + ')'; break; case 'g': g = g + inc; compval = g; d.style.background='rgb(' + r + ',' + g + ',' + b + ')'; break; case 'b': b = b + inc; compval = b; d.style.background='rgb(' + r + ',' + g + ',' + b + ')'; break; case 'a': a = getOpacity(d) + inc; compval = a; setOpacity(d,a); break; } if (inc>0) { if (compvaltarget) setTimeout("Transition('"+component+"',"+inc+","+target+","+delay+","+unlock+",'"+id+"')",delay); else inColorTransit = false;} } } function getOpacity(element){ try { temp_style = document.defaultView.getComputedStyle(element,null); if (!isNaN(temp_style.opacity)) opacityVal = temp_style.opacity; else if (!isNaN(temp_style.MozOpacity)) opacityVal = temp_style.MozOpacity; } catch (exc) { filter = element.style.filter; if(filter) { alpha = filter.split("alpha(opacity="); opacityVal = alpha[1].substr(0,(alpha[1].length-1))/100; } else { element.style.filter='alpha(opacity=100)'; opacityVal = 1; } } return parseFloat(opacityVal)*100; } function setOpacity(element, o) { if (browser=="IE") element.style.filter = "alpha(opacity=" + o + ")"; else element.style.opacity = o/100; } function HTR(h) {return parseInt((dH(h)).substring(0,2),16)} function HTG(h) {return parseInt((dH(h)).substring(2,4),16)} function HTB(h) {return parseInt((dH(h)).substring(4,6),16)} function dH(h) {return (h.charAt(0)=="#") ? h.substring(1,7) : h} if(navigator.userAgent.indexOf("MSIE")!=-1) browser = "IE"; else browser = "Mozilla";