/** * JSX (JavaScript eXtended) * * @author Roel Schut * @version 0.1.10 - 2008.04.18 */ if(typeof(NULL) == 'undefined') var NULL = null; if(typeof(undefined) == 'undefined') var undefined = 'undefined'; if(typeof(UNDEFINED) == 'undefined') var UNDEFINED = 'undefined'; if(typeof($) != 'function') { function $(obj) { if(typeof(obj) == 'string') obj = document.getElementById(obj); return obj; } } /*######################################################################################*/ var JSX = {}; var jsx = {}; JSX.getVersion = function() { return '0.1.9 beta'; }; /*######################################################################################*/ //if(typeof(Prototype) == 'undefined') /************************************************************************************* * Controleerd alle meegegeven variabelen of deze leeg zijn of niet. * * @param mixed $var Een variabele die gecontroleerd moet worden * @param mixed ... Nog een variabele die gecontroleerd moet worden * @return bool */ JSX.isEmpty = function() { var $r = false; var $iL = arguments.length; for(var $i=0; $i<$iL; $i++) { var $v = arguments[$i]; var $t = typeof($v); var $r = (($t == undefined || $v == null || $v == '') && $t != 'boolean'); if(!$r) break; } return $r; }; /************************************************************************************* * Controleerd alle meegegeven variabelen of deze gedefineerd zijn. * * @param mixed $var Een variabele die gecontroleerd moet worden * @param mixed ... Nog een variabele die gecontroleerd moet worden * @return bool */ JSX.isSet = function() { var $r = false; var $iL = arguments.length; for(var $i=0; $i<$iL; $i++) { var $v = arguments[$i]; var $r = (typeof($v) != undefined && $v != null); if(!$r) break; } return $r; } /************************************************************************************* * Controleerd of alle meegegeven variabelen voldoen aan het type $type dat in de * eersteparameter is aangegeven. Wanneer er 2 parameters worden meegestuurd en de 2e * een Array is, worden de waardes in deze Array vergeleken met het type $type. * * @param string $type Het type waaraan alle variabelen moeten voldoen * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isType = function($type, $var) { var $return = true; var $args = arguments; var $iL = $args.length; if($iL == 2 && JSX.isArray($args[1])) { $args = $args[1]; $args.unshift(''); $iL = $args.length; } for(var $i=1; $i<$iL; $i++) { $return = (typeof($args[$i]) == $type); if(!$return) break; } return $return; } /************************************************************************************* * Controleerd of de meegegeven variabele van het type NULL is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isNull = function($var) { return ($var == null); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type UNDEFINED is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isUndefined = function($var) { return (typeof($var) == undefined || $var == undefined); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Boolean is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isBool = JSX.isBoolean = function($var) { return ($var && typeof($var) == 'boolean'); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type String is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isString = function($var) { return ($var && typeof($var) == 'string' && !JSX.isUndefined($var)); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Number is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isInt = JSX.isNumber = function($var) { return ($var && typeof($var) == 'number'); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Number of anders een numerieke * String is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isNumeric = function($var) { if(JSX.isString($var)) $var = parseInt($var); return ($var && typeof($var) == 'number'); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Object is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isObject = function($var) { return ($var && typeof($var) == 'object'); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Object is en of de constructor * Array is wat inhoud dat de betreffende variabele een array is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isArray = function($var) { return ($var && typeof($var) == 'object' && $var.constructor === Array); } /************************************************************************************* * Controleerd of de meegegeven variabele van het type Function is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isFunction = function($var) { return ($var && typeof($var) == 'function'); } /************************************************************************************* * Controleerd of de meegegeven variabele scalar is. Dit houdt in dat er wordt * gekeken of de variabele van het type 'string', 'bool' of 'number' is. * * @param mixed $var Een variabele die moet worden gecontroleerd * @return bool */ JSX.isScalar = function($var) { return ($var && JSX.isString($var) || JSX.isBool($var) || isNumber($var)); } /*######################################################################################*/ /************************************************************************************* * Geeft de standaard waarde $value terug wanneer $var leeg is. * * @param mixed $var De variabele die moet worden gecontroleerd * @param mixed $value De standaard waarde die moet worden terug gegeven * @return mixed */ Function.def = function($var, $value) { return (JSX.isEmpty($var)) ? $value : $var; }; /*######################################################################################*/ Array.prototype.exists = function(value) { var exists = false; for(var i=0; i=$high; $low-=$step) { this.push($low); } } else if($low < $high) { for($low; $low<=$high; $low+=$step) { this.push($low); } } } else if(isString($low) && isString($high)) { $alpha = 'abcdefghijklmnopqrstuvwxyz'; //$low = $alpha.indexOf($low); //$high = $alpha.indexOf($high); /*if($high < $low) { for($low; $low>=$high; $low-=$step) { this.push($alpha.substr($low, 1)); } } else if($low < $high) { for($low; $low<26; $low+=$step) { this.push($alpha.substr($low, 1)); } }*/ } }; /*######################################################################################*/ String.substract = function($start, $length) { $start = parseInt($start); $length = parseInt($length); if($start < 0) $start = (this.length + $start); if($length < 0) $length = (this.length + $length); return this.substr($start, $length); }; /*######################################################################################*/ /* de loader functies worden gebruikt om functies aan het onLoad event toe te voegen */ JSX.Loader = {}; JSX.Loader.functions = []; /***************************************************************************************** * Voeg een function toe die moet worden uitgevoerd tijdens het onLoad event. * * @param function $func Een function die moet worden uitgevoerd * @param object $this Het Object waarin function zich bevind * @param array $args Een Array met argumenten voor de function * @return void */ JSX.Loader.add = function($func, $this, $args) { if(JSX.isFunction($func)) { var $this = Function.def($this, {}); var $args = Function.def($args, []); JSX.Loader.functions.push([$func, $this, $args]); } }; /***************************************************************************************** * Voer de toegevoegde functies uit tijdens onLoad. * * @return void */ window.onload = JSX.Loader.exec = function() { var $iL = JSX.Loader.functions.length; if($iL > 0) { for(var $i=0; $i<$iL; $i++) { var $func = JSX.Loader.functions[$i]; $func[0].apply($func[1], $func[2]); } } }; /*######################################################################################*/ JSX.Debug = {}; JSX.Debug.active = false; JSX.Debug.holder; JSX.Debug.activate = function() { var $debug = document.createElement('div'); $debug.setAttribute('id', 'jsx_debug'); $debug.style.margin = '2px'; $debug.style.padding = '2px'; $debug.style.borderColor = '#ff0000'; $debug.style.borderStyle = 'solid'; $debug.style.borderWidth = '3px'; $debug.style.fontFamily = 'Verdana, Arial, Helvetica, sans-serif'; $debug.style.fontSize = '11px'; $debug.innerHTML = 'JSX Debug'; JSX.Debug.holder = $debug; JSX.Debug.active = true; document.body.insertBefore($debug, document.body.firstChild); }; /***************************************************************************************** * Geeft alle waardes binnen een Object terug in een alert box. * * @param object $obj Het Object waarvan we de waardes willen tonen * @return bool */ JSX.Debug.object = function($obj) { //var $a = $obj +'\n\n'; var $a = ''; for(var $k in $obj) { var $v = $obj[$k]; if(typeof($v) != 'function') $a += $k +' = '+ $v +'\n'; } alert($a); }; /***************************************************************************************** * Geeft alle meegegeven parameters terug in een alert box. * * @param mixed $var Een variabele dat we willen tonen * @return bool */ JSX.Debug.trace = function($var) { var $sfx = ', '; var $msg = ''; var $iL = arguments.length; for(var $i=0; $i<$iL; $i++) { $msg += arguments[$i] + $sfx; } $msg = $msg.substr(0, ($msg.length-$sfx.length)); if(JSX.Debug.active) { JSX.Debug.holder.innerHTML = $msg +'
'+ JSX.Debug.holder.innerHTML; } else { alert($msg); } }; var trace = JSX.Debug.trace; /*######################################################################################*/ JSX.Error = {}; JSX.Error.raise = function($message, $page, $line, $chr) { alert("ERROR '"+ $message +"' on line '"+ $line +"' of page '"+ $page +"'"); }; /*######################################################################################*/ JSX.Browser = {}; JSX.BROWSER_IE = JSX.Browser.IE = 'msie'; JSX.BROWSER_FF = JSX.Browser.FF = 'firefox'; JSX.BROWSER_OPERA = JSX.Browser.OPERA = 'opera'; JSX.BROWSER_SAFARI = JSX.Browser.SAFARI = 'safari'; JSX.Browser.name = ''; JSX.Browser.version = ''; /***************************************************************************************** * Controleerd of de gebruiker op de browser $browser met versie $versie werkt. * * @param string $browser De naam van de browser * @param string $version De versie van de browser * @param string $seperator De seperator die tussen $browser en $version wordt geplaatst * @return bool */ JSX.Browser.isBrowser = function($browser, $version) { var $return = false; // kijk of we ook op versie moeten controleren if(!JSX.isEmpty($version)) { // kijk of uberhaubt de naam en/of versie van de browser al bekend is if(JSX.isEmpty(JSX.Browser.name) || JSX.isEmpty(JSX.Browser.version)) { var $separator = JSX.func.def($separator, ''); $return = (navigator.userAgent.toLowerCase().indexOf($browser + $separator + $version) != -1); if($return) { JSX.Browser.name = $browser; JSX.Browser.version = $version; } } // check anders of de huidige naam en versie overeenkomen met die we willen hebben else $return = (JSX.Browser.name == $browser && JSX.Browser.version == $version); } // zoniet controleer alleen de naam van de browser else { // wanneer deze leeg is gaan we 'm zoeken if(JSX.isEmpty(JSX.Browser.name)) { $return = (navigator.userAgent.toLowerCase().indexOf($browser) != -1); if($return) JSX.Browser.name = $browser; } // en anders controleren we gewoon met de naam die we al hebben else $return = (JSX.Browser.name == $browser); } return $return; }; /***************************************************************************************** * Voer een controle uit of de gebruiker de goede browser heeft en of $version voldoet * aan de methode $method waarmee we controleren. * * @param string $browser De naam van de browser * @param string $version De versie van de browser * @param string $method De controle methode waarmee de versie moet voldoen * @return bool */ JSX.Browser.check = function($browser, $version, $method) { var $agent = JSX.Browser.getDetails(); var $return = ($agent.name == $browser); // vervolgens controleren of de versie overeenkomt (wanneer meegegeven) if($return && !JSX.isEmpty($version)) { // de meegegeven version omzetten naar een array met apparte nrs var $versions = (String($version).indexOf('.') > -1) ? $version.split('.') : new Array(String($version)); var $vL = $versions.length; var $aL = $agent.versions.length; var $numV = 0; var $numA = 0; var $iL = Math.max($vL, $aL); for(var $i=0; $i<$iL; $i++) { if($i<$vL) $numV += ($versions[$i]*Math.pow(10, ($iL-$i))); if($i<$aL) $numA += ($agent.versions[$i]*Math.pow(10, ($iL-$i))); } //JSX.debug.alert($numV, $numA); // bepaal welke verglijk methode we gebruiken switch($method) { case 'lt': case '<': $return = ($numA < $numV); break; case 'lte': case '<=': $return = ($numA <= $numV); break; case 'gt': case '>': $return = ($numA > $numV); break; case 'gte': case '>=': $return = ($numA >= $numV); break; // 'eq', '==': default: $return = ($numA == $numV); break; } } return $return; }; /***************************************************************************************** * Geeft aan of de huidige browser van de bezoeker Internet Explorer gebaseerd is. * * @param string $version De versie waaraan de browser moet voldoen * @return bool */ JSX.Browser.isIE = JSX.Browser.isExplorer = function($version) { return JSX.Browser.isBrowser(JSX.Browser.IE, $version, ' '); //return JSX.Browser.checkBrowser(JSX.Browser.IE, $version, '=='); }; /***************************************************************************************** * Geeft aan of de huidige browser van de bezoeker Firefox gebaseerd is. * * @param string $version De versie waaraan de browser moet voldoen * @return bool */ JSX.Browser.isFF = JSX.Browser.isFirefox = function($version) { return JSX.Browser.isBrowser(JSX.Browser.FF, $version, '/'); }; /***************************************************************************************** * Geeft aan of de huidige browser van de bezoeker Opera gebaseerd is. * * @param string $version De versie waaraan de browser moet voldoen * @return bool */ JSX.Browser.isOpera = function($version) { return JSX.Browser.isBrowser(JSX.Browser.OPERA, $version, '/'); }; /***************************************************************************************** * Geeft aan of de huidige browser van de bezoeker Safari gebaseerd is. * * @param string $version De versie waaraan de browser moet voldoen * @return bool */ JSX.Browser.isSafari = function($version) { return JSX.Browser.isBrowser(JSX.Browser.SAFARI, $version, '/'); }; /***************************************************************************************** * Geeft de naam van de huidige browser terug. * * @return string */ JSX.Browser.getName = function() { if(JSX.isEmpty(JSX.Browser.name)) { if(JSX.Browser.isIE()){} else if(JSX.Browser.isFF()){} else if(JSX.Browser.isOpera()){} else if(JSX.Browser.isSafari()){} else JSX.Browser.browser = 'unknown'; } return JSX.Browser.name; }; /***************************************************************************************** * Geeft de versie van de huidige browser terug. * * @return string */ JSX.Browser.getVersion = function() { if(JSX.isEmpty(JSX.Browser.version)) { var $ua = navigator.userAgent.toLowerCase(); var $browser = JSX.Browser.getName(); var $version = 'unknown'; switch($browser) { case JSX.Browser.IE: case JSX.Browser.OPERA: var $d = ($browser == JSX.Browser.IE) ? ';' : ' '; var $s = ($ua.indexOf($browser)+JSX.Browser.length+1); $version = $ua.substr($s, ($ua.indexOf($d, $s)-$s)); break; case JSX.Browser.FF: case JSX.Browser.SAFARI: $version = $ua.substr($ua.indexOf($browser)+JSX.Browser.length+1); break; } JSX.Browser.version = $version; } return JSX.Browser.version; }; /***************************************************************************************** * Geeft een Object met de naam en de versie van de huidige browser terug. * * @return object */ JSX.Browser.getDetails = function() { var $browser = JSX.Browser.getName(); var $version = JSX.Browser.getVersion(); var $return = {}; $return.name = $browser; $return.version = $version; $return.versions = ($version.indexOf('.') > -1) ? $version.split('.') : new Array($version); return $return; }; /***************************************************************************************** * Geeft een Object met de breedte en hoogte van het huidige venster terug of FALSE * wanneer deze niet kan worden opgehaald. * * @return object|false */ JSX.Browser.getSize = function() { var $w = 0; var $h = 0; if(document.body.offsetWidth && document.body.offsetHeight) { $w = document.body.offsetWidth; $h = document.body.offsetHeight; } else if(document.body.clientWidth && document.body.clientHeight) { $w = document.body.clientWidth; $h = document.body.clientHeight; } else { $w = window.innerWidth; $h = window.innerHeight; } return ($w != 0 && $h != 0) ? {width: $w, height: $h} : false; }; /*######################################################################################*/ JSX.System = {}; JSX.SYSTEM_WIN = JSX.System.WIN = 'windows'; JSX.SYSTEM_MAC = JSX.System.MAC = 'mac'; JSX.SYSTEM_UNIX = JSX.System.UNIX = 'unix'; JSX.System.name = ''; JSX.System.version = ''; JSX.System.language = ''; /***************************************************************************************** * Controleerd of de gebruiker op het systeem $os werkt. * * @param string $os Het OS waarop moet worden gecontroleerd * @return bool */ JSX.System.isOS = function($os) { var $return = false; if(JSX.isEmpty(JSX.System.name)) { $return = (navigator.userAgent.toLowerCase().indexOf($os) != -1); if($return) JSX.System.name = $os; } return $return; }; /***************************************************************************************** * Geeft aan of de bezoeker op een Windows systeem werkt. * * @return bool */ JSX.System.isWin = function() { return JSX.System.isOS(JSX.SYSTEM_WIN); }; /***************************************************************************************** * Geeft aan of de bezoeker op een Macintosh systeem werkt. * * @return bool */ JSX.System.isMac = function() { return JSX.System.isOS(JSX.SYSTEM_MAC); }; /***************************************************************************************** * Geeft aan of de bezoeker op een *unix systeem werkt. * * @return bool */ JSX.System.isUnix = function() { return (!JSX.System.isWin() && !JSX.System.isMac()); }; /***************************************************************************************** * Geeft de naam van het huidige OS waarop de gebruiker werkt. * * @return string */ JSX.System.getName = function() { if(JSX.isEmpty(JSX.System.name)) { if(JSX.System.isWin()){} else if(JSX.System.isMac()){} else if(JSX.System.isUnix()){} else JSX.System.os = 'unknown'; } return JSX.System.name; }; /***************************************************************************************** * Geeft de versie van het huidige OS waarop de gebruiker werkt. * * @return string */ JSX.System.getVersion = function() { return undefined; }; /***************************************************************************************** * Geeft de taal van het huidige OS waarop de gebruiker werkt. * * @return string */ JSX.System.getLanguage = function() { var $return = undefined; var $langs = ['language', 'userLanguage', 'browserLanguage']; var $iL = $langs.length; for(var $i=0; $i<$iL; $i++) { var $lang = $langs[$i]; if(!JSX.isEmpty(navigator[$lang])) { $return = navigator[$lang]; if($i==0 && JSX.Browser.isSafari()) $return = $return.split('-')[0]; break; } } return $return; }; /*######################################################################################*/ JSX.Event = {}; /***************************************************************************************** * Geeft het Object waarop het wordt uitgevoerd de mogelijkheid om events uit te zenden. * * @param object $target Het Object die events moet kunnen uitzenden * @return void */ JSX.Event.makeBroadcaster = function($target) { $target.__listeners = [$target]; /************************************************************************************* * ... * * @return void */ $target.addEventListener = function($listener) { this.__listeners.push($listener); }; $target.removeEventListener = function($listener) { var $iL = this.__listeners.length; for(var $i=0; $i<$iL; $i++) { if(this.__listeners[$i] == $listener) { alert('remove listener'); this.__listeners.splice($i, 1); break; } } }; /*$target.addEventHandler = function($eventName, $eventHandler) { var $listener = {}; $listener[$eventName] = $eventHandler; if(!JSX.isArray(this.___handlers[$eventName])) this.___handlers[$eventName] = new Array(); this.___handlers[$eventName].push([$eventHandler, $listener]); this.addEventListener($listener); }; $target.removeEventHandler = function($eventName, $eventHandler) { var $list = this.___handlers[$eventName]; var $iL = $list.length; alert('remove '+ $eventName +', '+ $list +', '+ $iL); for(var $i=0; $i<$iL; $i++) { if($list[0] == $eventHandler) { alert('remove '+ $eventName); this.___handlers[$eventName].splice($i, 1); this.removeEventListener($list[1]); break; } } };*/ $target.dispatchEvent = function($eventName, $args) { if(!JSX.isArray($args)) $args = []; var $iL = this.__listeners.length; for(var $i=0; $i<$iL; $i++) { var $listener = this.__listeners[$i]; if(JSX.isSet($listener) && JSX.isFunction($listener[$eventName])) { $listener[$eventName].apply($listener, $args); } } }; }; JSX.Event.attach = function($target, $eventName, $eventHandler) { $eventName = $eventName.toLowerCase(); // ff if($target.addEventListener) { $eventName = $eventName.substr(2); $target.addEventListener($eventName, $eventHandler, false); } // ie else if($target.attachEvent) { $target.attachEvent($eventName, $eventHandler); } else { var $event = $target[$eventName]; if(!JSX.isFunction($event)) $target[$eventName] = $eventHandler; else { $target[$eventName] = function($e) { $event($e); $eventHandler($e); }; } } }; /*######################################################################################*/ JSX.Class = {}; /***************************************************************************************** * ... * * @return function */ JSX.Class.create = function($name) { if(!JSX.isString($name)) var $name = ''; return function() { this.__name = $name; if(JSX.isFunction(this.__construct)) { this.__construct.apply(this, arguments); } if(!JSX.isFunction(this.toString)) { return '[object '+ this.__name +']'; } } }; JSX.Class.destroy = function($obj) { if(JSX.isFunction($obj.__deconstruct)) $obj.__deconstruct(); $obj = null; return $obj; }; /************************************************************************************* * Geeft de naam van de class waaruit het Object bestaat terug. * * @param mixed $var De variabele waarvan we de naam van de class willen weten * @return string */ JSX.Class.getName = function($var) { var $return = null; if(JSX.isSet($var) && !JSX.isEmpty($var.constructor)) { var $t = $var.toString(); if($t.substr(0, 1) == '[' && $t.substr($t.length-1) == ']') { $return = $t.substr(8, ($t.length-9)); } else { $t = String($var.constructor); var $s = ($t.indexOf('function ')+9); $return = $t.substr($s, ($t.indexOf('(', $s)-$s)); } } return $return; }; JSX.Class.getMethods = function($class) { var $return = []; if(JSX.isFunction($class)) $class = $class.prototype; if(JSX.isObject($class)) { for(var $k in $class) { if(JSX.isFunction($class[$k])) $return.push($k); } } return $return; }; JSX.Class.hasMethod = function($class, $method) { if(JSX.isFunction($class)) $class = $class.prototype; return (JSX.isObject($class) && JSX.isFunction($class[$method])); };