finalized language support and fixed some more bugsmaster
After Width: | Height: | Size: 475 B |
After Width: | Height: | Size: 85 B |
After Width: | Height: | Size: 556 B |
After Width: | Height: | Size: 631 B |
After Width: | Height: | Size: 633 B |
After Width: | Height: | Size: 731 B |
After Width: | Height: | Size: 701 B |
After Width: | Height: | Size: 70 B |
After Width: | Height: | Size: 199 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 577 B |
After Width: | Height: | Size: 635 B |
After Width: | Height: | Size: 200 B |
After Width: | Height: | Size: 649 B |
After Width: | Height: | Size: 566 B |
After Width: | Height: | Size: 663 B |
After Width: | Height: | Size: 660 B |
After Width: | Height: | Size: 744 B |
After Width: | Height: | Size: 683 B |
After Width: | Height: | Size: 723 B |
After Width: | Height: | Size: 741 B |
After Width: | Height: | Size: 746 B |
After Width: | Height: | Size: 767 B |
After Width: | Height: | Size: 833 B |
After Width: | Height: | Size: 663 B |
@ -1,16 +1,37 @@ |
||||
IP Reg Installation |
||||
|
||||
1. Create database |
||||
Create a database for IP Reg on your web server, as well as a MySQL user who has all privileges for accessing and modifying it. |
||||
1. Install requirements |
||||
IP Reg version 0.6 and up depends on smarty template engine. |
||||
In Debian install ist with: "apt-get install smarty3". |
||||
The GHP-GD module is also required: "apt-get install php-gd". |
||||
|
||||
2. Run import |
||||
Import the mysql.sql file into your database, which will create the tables and some sample data. |
||||
2. Create database |
||||
Create a database for IP Reg on your web server, as well as a MySQL user who |
||||
has all privileges for accessing and modifying it. |
||||
|
||||
3. Edit config file |
||||
CREATE DATABASE ipreg; |
||||
|
||||
Create database-user for application with minimum necessary rights. |
||||
|
||||
CREATE USER 'ipreg'@'localhost' IDENTIFIED BY '********'; |
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ipreg.* TO 'ipreg'@'localhost'; |
||||
|
||||
3. Run import |
||||
Import the mysql.sql file into your database, which will create the tables |
||||
and some sample data. |
||||
|
||||
mysql ipreg < mysql.sql |
||||
|
||||
4. Edit config file |
||||
Open config.php in a text editor and fill in your database details. |
||||
|
||||
4. Upload files |
||||
Upload all files and directory's (except the install directory) to your webserver. |
||||
5. Upload files |
||||
Upload all files and directory's (except the install directory) to your |
||||
webserver. |
||||
|
||||
6. Check file access rights for security |
||||
Only directory tpl_c should be writeble by webserver |
||||
|
||||
5. Start using IP Reg |
||||
Start your browser and login to IP Reg with the default username/password: admin/admin |
||||
7. Start using IP Reg |
||||
Start your browser and login to IP Reg with the default username/password: |
||||
admin/admin |
||||
|
@ -0,0 +1,222 @@ |
||||
<?php |
||||
|
||||
$lang = array( |
||||
'lang_ipreg' => 'IP Reg', |
||||
|
||||
'lang_asset' => 'Objekt', |
||||
'lang_assets' => 'Objekte', |
||||
'lang_assetclass' => 'Objektklasse', |
||||
'lang_assetclasses' => 'Objektklassen', |
||||
'lang_assetclassgroup' => 'Objektklassengruppe', |
||||
'lang_assetclassgroups' => 'Objektklassengruppen', |
||||
'lang_location' => 'Standort', |
||||
'lang_locations' => 'Standorte', |
||||
'lang_menu' => 'Menü', |
||||
'lang_node' => 'Knoten', |
||||
'lang_nodes' => 'Knoten', |
||||
'lang_user' => 'Benutzer', |
||||
'lang_users' => 'Benutzer', |
||||
'lang_zone' => 'Zone', |
||||
'lang_zones' => 'Zonen', |
||||
'lang_sublocation' => 'Unterstandort', |
||||
'lang_sublocations' => 'Unterstandorte', |
||||
'lang_subnet' => 'Subnetz', |
||||
'lang_subnets' => 'Subnetze', |
||||
'lang_tooltips' => 'Tooltips', |
||||
'lang_vlan' => 'VLAN', |
||||
'lang_vlans' => 'VLANs', |
||||
|
||||
'lang_about' => 'Ãœber', |
||||
'lang_all' => 'Allw', |
||||
'lang_cancel' => 'Abbruch', |
||||
'lang_color' => 'Farbe', |
||||
'lang_error' => 'Fehler', |
||||
'lang_item' => 'Gegenstand', |
||||
'lang_language' => 'Sprache', |
||||
'lang_login' => 'Anmelden', |
||||
'lang_logout' => 'Abmelden', |
||||
'lang_options' => 'Optionen', |
||||
'lang_option_none' => '(kein)', |
||||
'lang_reset' => 'Zurücksetzen', |
||||
'lang_search' => 'Suche', |
||||
'lang_statistics' => 'Statistik', |
||||
'lang_subitem' => 'Sub-Item', |
||||
'lang_submit' => 'Absenden', |
||||
'lang_unassigned' => 'Nicht zugeordnet', |
||||
'lang_warning' => 'Warnung', |
||||
|
||||
'lang_asset_add' => 'Objekt hinzufügen', |
||||
'lang_asset_del' => 'Objekt löschen', |
||||
'lang_asset_edit' => 'Objekt ändern', |
||||
'lang_asset_info' => 'Objektinfo', |
||||
'lang_asset_name' => 'Objektname', |
||||
'lang_asset_hostname' => 'Hostname', |
||||
'lang_asset_none' => 'Es sind keine Objekte vorhanden', |
||||
|
||||
'lang_assetclass_add' => 'Objektklasse hinzufügen', |
||||
'lang_assetclass_del' => 'Objektklasse löschen', |
||||
'lang_assetclass_edit' => 'Objektklasse ändern', |
||||
'lang_assetclass_name' => 'Objektklassenname', |
||||
'lang_assetclass_none' => 'Es sind keine Objektklassen vorhanden', |
||||
|
||||
'lang_assetclassgroup_add' => 'Objektklassengruppe hinzufügen', |
||||
'lang_assetclassgroup_del' => 'Objektklassengruppe löschen', |
||||
'lang_assetclassgroup_edit' => 'Objektklassengruppe ändern', |
||||
'lang_assetclassgroup_name' => 'Objektklassengruppenname', |
||||
'lang_assetclassgroup_none' => 'Es sind keine Objektklassengruppen vorhanden', |
||||
|
||||
'lang_assignnodetoasset' => 'Knoten zu Objekt hinzufügen', |
||||
'lang_assignnodetoasset_existing' => 'Knoten zu existierendem Objekt hinzufügen', |
||||
'lang_assignnodetoasset_new' => 'Knoten zu neuem Objekt hinzufügen', |
||||
'lang_assigniptonode' => 'IP zu Knoten hinzufügen', |
||||
'lang_assigniptonode_existing' => 'IP zu existierendem Knoten hinzufügen', |
||||
'lang_assigniptonode_new' => 'IP zu neuem Knoten hinzufügen', |
||||
'lang_assignlocationtosubnet' => 'Standort zu Subnetz hinzufügen', |
||||
'lang_assignlocationtosubnet_existing' => 'Assign location to existing subnet', |
||||
'lang_assignlocationtosubnet_new' => 'Assign location to new subnet', |
||||
'lang_assignsubnettovlan' => 'Assign subnet to VLAN', |
||||
'lang_assignsubnettovlan_existing' => 'Assign subnet to existing VLAN', |
||||
'lang_assignsubnettovlan_new' => 'Assign subnet to new VLAN', |
||||
'lang_assignvlantosubnet' => 'Assign VLAN to subnet', |
||||
'lang_assignvlantosubnet_existing' => 'Assign VLAN to existing subnet', |
||||
'lang_assignvlantosubnet_new' => 'Assign VLAN to new subnet', |
||||
|
||||
'lang_location_add' => 'Standort hinzufügen', |
||||
'lang_location_del' => 'Standort löschen', |
||||
'lang_location_edit' => 'Standort ändern', |
||||
'lang_location_info' => 'Standortinfo', |
||||
'lang_location_name' => 'Standortname', |
||||
'lang_location_parent' => 'Ãœbergeordneter Standort', |
||||
'lang_sublocation_add' => 'Unterstandort hinzufügen', |
||||
|
||||
'lang_locationsubnet' => 'Standort/Subnetz', |
||||
'lang_locationsubnet_edit' => 'Standort/Subnetz bearbeiten', |
||||
|
||||
'lang_node_add' => 'Knoten hinzufügen', |
||||
'lang_node_del' => 'Knoten löschen', |
||||
'lang_node_edit' => 'Knoten ändern', |
||||
'lang_node_info' => 'Knoteninfo', |
||||
'lang_dns1' => 'DNS-Name', |
||||
'lang_dns2' => 'DNS-Alias', |
||||
'lang_ip' => 'IP-Adresse', |
||||
'lang_mac' => 'MAC-Adresse', |
||||
'lang_proto_vers' => 'Protokollversion', |
||||
|
||||
'lang_nat' => 'NAT', |
||||
'lang_nat_add' => 'NAT hinzufügen', |
||||
'lang_nat_del' => 'NAT löschen', |
||||
'lang_nat_edit' => 'NAT ändern', |
||||
'lang_nat_rules' => 'NAT Regeln', |
||||
'lang_nat_type' => 'Typ', |
||||
'lang_nat_type_1' => 'Verbergen', |
||||
'lang_nat_type_2' => 'Statisch', |
||||
'lang_nat_type_3' => 'Dynamisch', |
||||
|
||||
'lang_search_results_found' => 'Anzahl der gefundenen Ergebnisse: ', |
||||
|
||||
'lang_subnet_add' => 'Subnetz hinzufügen', |
||||
'lang_subnet_subnetaddress' => 'Subnetzadresse', |
||||
'lang_subnet_subnetaddress_mask' => 'Subnetzadresse/Maske', |
||||
'lang_subnet_broadcastaddress' => 'Broadcastadresse', |
||||
'lang_subnet_nodesinsubnet' => 'Nodes im Subnetz', |
||||
'lang_subnet_subnetused' => 'Subnetz benutzt', |
||||
'lang_subnet_del' => 'Subnetz löschen', |
||||
'lang_subnet_edit' => 'Subnetz ändern', |
||||
'lang_subnet_info' => 'Subnetzinfo', |
||||
'lang_subnet_mask' => 'Subnetzmaske', |
||||
'lang_subnet_dhcp' => 'DHCP ausschließen', |
||||
'lang_subnet_dhcpstart' => 'DHCP Anfang', |
||||
'lang_subnet_dhcpend' => 'DHCP Ende', |
||||
'lang_subnet_ntp_server' => 'NTP-Server', |
||||
|
||||
'lang_subnetlocation' => 'Subnetz/Ort', |
||||
'lang_subnetlocation_edit' => 'Subnetz/Ort bearbeiten', |
||||
'lang_subnetvlan' => 'Subnetz/VLAN', |
||||
'lang_subnetvlan_edit' => 'Subnetz/VLAN bearbeiten', |
||||
|
||||
'lang_user_add' => 'Benutzer hinzufügen', |
||||
'lang_user_del' => 'Benutzer löschen', |
||||
'lang_user_displayname' => 'Anzeigename', |
||||
'lang_user_edit' => 'Benutzer bearbeiten', |
||||
'lang_user_name' => 'Benutzername', |
||||
'lang_user_password' => 'Kennwort', |
||||
'lang_user_language' => 'Sprache', |
||||
|
||||
'lang_zone_add' => 'Zone hinzufügen', |
||||
'lang_zone_del' => 'Zone löschen', |
||||
'lang_zone_edit' => 'Zone bearbeiten', |
||||
|
||||
|
||||
'lang_vlan_add' => 'VLAN hinzufügen', |
||||
'lang_vlan_del' => 'VLAN löschen', |
||||
'lang_vlan_edit' => 'VLAN ändern', |
||||
'lang_vlan_number' => 'VLAN ID', |
||||
'lang_vlan_info' => 'VLAN Info', |
||||
'lang_vlan_new' => 'VLAN Info', |
||||
'lang_vlan_name' => 'VLAN Name', |
||||
|
||||
'lang_vlansubnet' => 'VLAN/Subnetz', |
||||
'lang_vlansubnet_edit' => 'VLAN/Subnetz bearbeiten', |
||||
|
||||
'lang_comments' => 'Kommentare', |
||||
'lang_comments_error' => 'Fehler', |
||||
'lang_comments_asset_del_nodes' => 'Diese Knoten werden ebenfalls gelöscht!', |
||||
'lang_comments_ipinuse' => 'IP wird bereits verwendet', |
||||
'lang_comments_notallowed' => 'Nicht erlaubt', |
||||
'lang_comments_search_nosearch' => 'Es gibt nichts zu suchen!', |
||||
'lang_comments_usernameinuse' => 'Benutzername wird bereits verwendet', |
||||
'lang_comments_invalidpass' => 'Das Kennwort ist falsch', |
||||
'lang_comments_invalidnewpass' => 'Das neue Kennwort wurde nicht korrekt eingegeben', |
||||
|
||||
'lang_options_ipreg' => 'IP Reg Optionen', |
||||
'lang_options_display' => 'Anzeigeeinstellungen', |
||||
'lang_options_password' => 'Kennwort ändern', |
||||
'lang_options_imagesize' => 'Bildgröße', |
||||
'lang_options_imagesize_help' => 'Größe (in Pixel) der farbigen Quadrate in der Subnetzanzeige', |
||||
'lang_options_imagecount' => 'Bildanzahl', |
||||
'lang_options_imagecount_help' => 'Anzahl der farbigen Quadrate je Zeile in der Subnetzanzeige', |
||||
'lang_options_mac' => 'MAC-Adresse', |
||||
'lang_options_mac_help' => 'Format in der eine MAC-Adresse dargestellt wird (z.B. xx-xx-xx-xx-xx-xx)', |
||||
'lang_options_menu_help' => 'Select items to be displayed in menu', |
||||
'lang_options_dateformat' => 'Datumsformat', |
||||
'lang_options_dateformat_help' => 'Format in which dates are displayed using the php-date-format (see http://www.php.net/date for more info)', |
||||
'lang_options_dns1suffix' => 'DNS Name suffix', |
||||
'lang_options_dns1suffix_help' => 'Default DNS Name suffix für neue Knoten', |
||||
'lang_options_dns2suffix' => 'DNS Alias suffix', |
||||
'lang_options_dns2suffix_help' => 'Default DNS Alias suffix für neue Knoten', |
||||
'lang_options_currentpassword' => 'Aktuelles Kennwort', |
||||
'lang_options_currentpassword_help' => 'Bitte geben Sie hier Ihr bisheriges Kennwort ein', |
||||
'lang_options_newpassword1' => 'Neues Kennwort', |
||||
'lang_options_newpassword1_help' => 'Bitte geben Sie hier Ihr neues Kennwort ein', |
||||
'lang_options_newpassword2' => 'Neues Kennwort (Wiederholung)', |
||||
'lang_options_newpassword2_help' => 'Bitte geben Sie hier nochmals Ihr neues Kennwort ein', |
||||
'lang_options_tooltips_help' => 'Tooltips anzeigen', |
||||
'lang_options_language_help' => 'Sprache für diesen Benutzer', |
||||
|
||||
'lang_about_sfprojectpage' => 'Sourceforge Project Page', |
||||
'lang_about_license' => 'Lizenz', |
||||
'lang_about_gpl' => 'GNU General Public License (GPL)', |
||||
'lang_about_smarty' => 'Smarty Template Engine', |
||||
'lang_about_iconset' => 'Silk icon set 1.3', |
||||
'lang_about_ipreg_ext' => 'IP Reg, a PHP/MySQL IPAM tool', |
||||
'lang_about_license_ext' => 'Copyright (C) 2007-2009 Wietse Warendorff (up to v0.5)<br>Copyright (C) 2011-2023 Thomas Hooge<p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<p> You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.', |
||||
|
||||
'lang_about_changelog' => 'Changelog (major changes only)', |
||||
'lang_about_changelog_v07' => 'v0.7 (oct 2018)', |
||||
'lang_about_changelog_v07_ext' => '- Added support for PHP7, switched to mysqli', |
||||
'lang_about_changelog_v06' => 'v0.6 (may 2011)', |
||||
'lang_about_changelog_v06_ext' => '- Moved towards smarty template engine<br />- language support finalized<br />- added german language<br />- some small bug fixes', |
||||
'lang_about_changelog_v05' => 'v0.5 (dec 2009)', |
||||
'lang_about_changelog_v05_ext' => '- Complete code rewrite<br>- Input sanitation<br>- Background image<br>- Added multiple counters<br>- HTML is now 100% W3C valid<br>More user options', |
||||
'lang_about_changelog_v04' => 'v0.4 (jun 2008)', |
||||
'lang_about_changelog_v04_ext' => '- SQL vulnerability fixed<br>- PHP-generated images in subnet overview', |
||||
'lang_about_changelog_v03' => 'v0.3 (dec 2007)', |
||||
'lang_about_changelog_v03_ext' => '- Class A subnet support<br>- Multi-language support<br>- User defined options<br>- All configuration options in one file (config.php)', |
||||
'lang_about_changelog_v02' => 'v0.2 (dec 2007)', |
||||
'lang_about_changelog_v02_ext' => '- Fixed ordering of IP addresses<br>- Fixed info fields', |
||||
'lang_about_changelog_v01' => 'v0.1 (dec 2007)', |
||||
'lang_about_changelog_v01_ext' => '- First beta release', |
||||
|
||||
); |
||||
|
||||
?> |
After Width: | Height: | Size: 66 B |
@ -1,5 +1,5 @@ |
||||
function changelink(optVal){ |
||||
function changelink(optVal) { |
||||
if(optVal=="") |
||||
return false; |
||||
window.location='subnetview.php?subnet_id='+optVal; |
||||
} |
||||
} |
@ -1,3 +1,3 @@ |
||||
function changetext(id,newtext) { |
||||
function changetext(id,newtext) { |
||||
document.getElementById(id).innerHTML=newtext |
||||
} |
||||
} |
After Width: | Height: | Size: 83 B |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,840 @@ |
||||
/** |
||||
* jscolor, JavaScript Color Picker |
||||
* |
||||
* @version 1.3.1 |
||||
* @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html
|
||||
* @author Jan Odvarko, http://odvarko.cz
|
||||
* @created 2008-06-15 |
||||
* @updated 2010-01-23 |
||||
* @link http://jscolor.com
|
||||
*/ |
||||
|
||||
|
||||
var jscolor = { |
||||
|
||||
|
||||
dir : '', // location of jscolor directory (leave empty to autodetect)
|
||||
bindClass : 'color', // class name
|
||||
binding : true, // automatic binding via <input class="...">
|
||||
preloading : true, // use image preloading?
|
||||
|
||||
|
||||
install : function() { |
||||
jscolor.addEvent(window, 'load', jscolor.init); |
||||
}, |
||||
|
||||
|
||||
init : function() { |
||||
if(jscolor.binding) { |
||||
jscolor.bind(); |
||||
} |
||||
if(jscolor.preloading) { |
||||
jscolor.preload(); |
||||
} |
||||
}, |
||||
|
||||
|
||||
getDir : function() { |
||||
if(!jscolor.dir) { |
||||
var detected = jscolor.detectDir(); |
||||
jscolor.dir = detected!==false ? detected : 'jscolor/'; |
||||
} |
||||
return jscolor.dir; |
||||
}, |
||||
|
||||
|
||||
detectDir : function() { |
||||
var base = location.href; |
||||
|
||||
var e = document.getElementsByTagName('base'); |
||||
for(var i=0; i<e.length; i+=1) { |
||||
if(e[i].href) { base = e[i].href; } |
||||
} |
||||
|
||||
var e = document.getElementsByTagName('script'); |
||||
for(var i=0; i<e.length; i+=1) { |
||||
if(e[i].src && /(^|\/)jscolor\.js([?#].*)?$/i.test(e[i].src)) { |
||||
var src = new jscolor.URI(e[i].src); |
||||
var srcAbs = src.toAbsolute(base); |
||||
srcAbs.path = srcAbs.path.replace(/[^\/]+$/, ''); // remove filename
|
||||
srcAbs.query = null; |
||||
srcAbs.fragment = null; |
||||
return srcAbs.toString(); |
||||
} |
||||
} |
||||
return false; |
||||
}, |
||||
|
||||
|
||||
bind : function() { |
||||
var matchClass = new RegExp('(^|\\s)('+jscolor.bindClass+')\\s*(\\{[^}]*\\})?', 'i'); |
||||
var e = document.getElementsByTagName('input'); |
||||
for(var i=0; i<e.length; i+=1) { |
||||
var m; |
||||
if(!e[i].color && e[i].className && (m = e[i].className.match(matchClass))) { |
||||
var prop = {}; |
||||
if(m[3]) { |
||||
try { |
||||
eval('prop='+m[3]); |
||||
} catch(eInvalidProp) {} |
||||
} |
||||
e[i].color = new jscolor.color(e[i], prop); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
|
||||
preload : function() { |
||||
for(var fn in jscolor.imgRequire) { |
||||
if(jscolor.imgRequire.hasOwnProperty(fn)) { |
||||
jscolor.loadImage(fn); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
|
||||
images : { |
||||
pad : [ 181, 101 ], |
||||
sld : [ 16, 101 ], |
||||
cross : [ 15, 15 ], |
||||
arrow : [ 7, 11 ] |
||||
}, |
||||
|
||||
|
||||
imgRequire : {}, |
||||
imgLoaded : {}, |
||||
|
||||
|
||||
requireImage : function(filename) { |
||||
jscolor.imgRequire[filename] = true; |
||||
}, |
||||
|
||||
|
||||
loadImage : function(filename) { |
||||
if(!jscolor.imgLoaded[filename]) { |
||||
jscolor.imgLoaded[filename] = new Image(); |
||||
jscolor.imgLoaded[filename].src = jscolor.getDir()+filename; |
||||
} |
||||
}, |
||||
|
||||
|
||||
fetchElement : function(mixed) { |
||||
return typeof mixed === 'string' ? document.getElementById(mixed) : mixed; |
||||
}, |
||||
|
||||
|
||||
addEvent : function(el, evnt, func) { |
||||
if(el.addEventListener) { |
||||
el.addEventListener(evnt, func, false); |
||||
} else if(el.attachEvent) { |
||||
el.attachEvent('on'+evnt, func); |
||||
} |
||||
}, |
||||
|
||||
|
||||
fireEvent : function(el, evnt) { |
||||
if(!el) { |
||||
return; |
||||
} |
||||
if(document.createEventObject) { |
||||
var ev = document.createEventObject(); |
||||
el.fireEvent('on'+evnt, ev); |
||||
} else if(document.createEvent) { |
||||
var ev = document.createEvent('HTMLEvents'); |
||||
ev.initEvent(evnt, true, true); |
||||
el.dispatchEvent(ev); |
||||
} else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5)
|
||||
el['on'+evnt](); |
||||
} |
||||
}, |
||||
|
||||
|
||||
getElementPos : function(e) { |
||||
var e1=e, e2=e; |
||||
var x=0, y=0; |
||||
if(e1.offsetParent) { |
||||
do { |
||||
x += e1.offsetLeft; |
||||
y += e1.offsetTop; |
||||
} while(e1 = e1.offsetParent); |
||||
} |
||||
while((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== 'BODY') { |
||||
x -= e2.scrollLeft; |
||||
y -= e2.scrollTop; |
||||
} |
||||
return [x, y]; |
||||
}, |
||||
|
||||
|
||||
getElementSize : function(e) { |
||||
return [e.offsetWidth, e.offsetHeight]; |
||||
}, |
||||
|
||||
|
||||
getMousePos : function(e) { |
||||
if(!e) { e = window.event; } |
||||
if(typeof e.pageX === 'number') { |
||||
return [e.pageX, e.pageY]; |
||||
} else if(typeof e.clientX === 'number') { |
||||
return [ |
||||
e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft, |
||||
e.clientY + document.body.scrollTop + document.documentElement.scrollTop |
||||
]; |
||||
} |
||||
}, |
||||
|
||||
|
||||
getViewPos : function() { |
||||
if(typeof window.pageYOffset === 'number') { |
||||
return [window.pageXOffset, window.pageYOffset]; |
||||
} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) { |
||||
return [document.body.scrollLeft, document.body.scrollTop]; |
||||
} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { |
||||
return [document.documentElement.scrollLeft, document.documentElement.scrollTop]; |
||||
} else { |
||||
return [0, 0]; |
||||
} |
||||
}, |
||||
|
||||
|
||||
getViewSize : function() { |
||||
if(typeof window.innerWidth === 'number') { |
||||
return [window.innerWidth, window.innerHeight]; |
||||
} else if(document.body && (document.body.clientWidth || document.body.clientHeight)) { |
||||
return [document.body.clientWidth, document.body.clientHeight]; |
||||
} else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { |
||||
return [document.documentElement.clientWidth, document.documentElement.clientHeight]; |
||||
} else { |
||||
return [0, 0]; |
||||
} |
||||
}, |
||||
|
||||
|
||||
URI : function(uri) { // See RFC3986
|
||||
|
||||
this.scheme = null; |
||||
this.authority = null; |
||||
this.path = ''; |
||||
this.query = null; |
||||
this.fragment = null; |
||||
|
||||
this.parse = function(uri) { |
||||
var m = uri.match(/^(([A-Za-z][0-9A-Za-z+.-]*)(:))?((\/\/)([^\/?#]*))?([^?#]*)((\?)([^#]*))?((#)(.*))?/); |
||||
this.scheme = m[3] ? m[2] : null; |
||||
this.authority = m[5] ? m[6] : null; |
||||
this.path = m[7]; |
||||
this.query = m[9] ? m[10] : null; |
||||
this.fragment = m[12] ? m[13] : null; |
||||
return this; |
||||
}; |
||||
|
||||
this.toString = function() { |
||||
var result = ''; |
||||
if(this.scheme !== null) { result = result + this.scheme + ':'; } |
||||
if(this.authority !== null) { result = result + '//' + this.authority; } |
||||
if(this.path !== null) { result = result + this.path; } |
||||
if(this.query !== null) { result = result + '?' + this.query; } |
||||
if(this.fragment !== null) { result = result + '#' + this.fragment; } |
||||
return result; |
||||
}; |
||||
|
||||
this.toAbsolute = function(base) { |
||||
var base = new jscolor.URI(base); |
||||
var r = this; |
||||
var t = new jscolor.URI; |
||||
|
||||
if(base.scheme === null) { return false; } |
||||
|
||||
if(r.scheme !== null && r.scheme.toLowerCase() === base.scheme.toLowerCase()) { |
||||
r.scheme = null; |
||||
} |
||||
|
||||
if(r.scheme !== null) { |
||||
t.scheme = r.scheme; |
||||
t.authority = r.authority; |
||||
t.path = removeDotSegments(r.path); |
||||
t.query = r.query; |
||||
} else { |
||||
if(r.authority !== null) { |
||||
t.authority = r.authority; |
||||
t.path = removeDotSegments(r.path); |
||||
t.query = r.query; |
||||
} else { |
||||
if(r.path === '') { // TODO: == or === ?
|
||||
t.path = base.path; |
||||
if(r.query !== null) { |
||||
t.query = r.query; |
||||
} else { |
||||
t.query = base.query; |
||||
} |
||||
} else { |
||||
if(r.path.substr(0,1) === '/') { |
||||
t.path = removeDotSegments(r.path); |
||||
} else { |
||||
if(base.authority !== null && base.path === '') { // TODO: == or === ?
|
||||
t.path = '/'+r.path; |
||||
} else { |
||||
t.path = base.path.replace(/[^\/]+$/,'')+r.path; |
||||
} |
||||
t.path = removeDotSegments(t.path); |
||||
} |
||||
t.query = r.query; |
||||
} |
||||
t.authority = base.authority; |
||||
} |
||||
t.scheme = base.scheme; |
||||
} |
||||
t.fragment = r.fragment; |
||||
|
||||
return t; |
||||
}; |
||||
|
||||
function removeDotSegments(path) { |
||||
var out = ''; |
||||
while(path) { |
||||
if(path.substr(0,3)==='../' || path.substr(0,2)==='./') { |
||||
path = path.replace(/^\.+/,'').substr(1); |
||||
} else if(path.substr(0,3)==='/./' || path==='/.') { |
||||
path = '/'+path.substr(3); |
||||
} else if(path.substr(0,4)==='/../' || path==='/..') { |
||||
path = '/'+path.substr(4); |
||||
out = out.replace(/\/?[^\/]*$/, ''); |
||||
} else if(path==='.' || path==='..') { |
||||
path = ''; |
||||
} else { |
||||
var rm = path.match(/^\/?[^\/]*/)[0]; |
||||
path = path.substr(rm.length); |
||||
out = out + rm; |
||||
} |
||||
} |
||||
return out; |
||||
} |
||||
|
||||
if(uri) { |
||||
this.parse(uri); |
||||
} |
||||
|
||||
}, |
||||
|
||||
|
||||
/* |
||||
* Usage example: |
||||
* var myColor = new jscolor.color(myInputElement) |
||||
*/ |
||||
|
||||
color : function(target, prop) { |
||||
|
||||
|
||||
this.required = true; // refuse empty values?
|
||||
this.adjust = true; // adjust value to uniform notation?
|
||||
this.hash = false; // prefix color with # symbol?
|
||||
this.caps = true; // uppercase?
|
||||
this.valueElement = target; // value holder
|
||||
this.styleElement = target; // where to reflect current color
|
||||
this.hsv = [0, 0, 1]; // read-only 0-6, 0-1, 0-1
|
||||
this.rgb = [1, 1, 1]; // read-only 0-1, 0-1, 0-1
|
||||
|
||||
this.pickerOnfocus = true; // display picker on focus?
|
||||
this.pickerMode = 'HSV'; // HSV | HVS
|
||||
this.pickerPosition = 'bottom'; // left | right | top | bottom
|
||||
this.pickerFace = 10; // px
|
||||
this.pickerFaceColor = 'ThreeDFace'; // CSS color
|
||||
this.pickerBorder = 1; // px
|
||||
this.pickerBorderColor = 'ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight'; // CSS color
|
||||
this.pickerInset = 1; // px
|
||||
this.pickerInsetColor = 'ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow'; // CSS color
|
||||
this.pickerZIndex = 10000; |
||||
|
||||
|
||||
for(var p in prop) { |
||||
if(prop.hasOwnProperty(p)) { |
||||
this[p] = prop[p]; |
||||
} |
||||
} |
||||
|
||||
|
||||
this.hidePicker = function() { |
||||
if(isPickerOwner()) { |
||||
removePicker(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.showPicker = function() { |
||||
if(!isPickerOwner()) { |
||||
var tp = jscolor.getElementPos(target); // target pos
|
||||
var ts = jscolor.getElementSize(target); // target size
|
||||
var vp = jscolor.getViewPos(); // view pos
|
||||
var vs = jscolor.getViewSize(); // view size
|
||||
var ps = [ // picker size
|
||||
2*this.pickerBorder + 4*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0], |
||||
2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1] |
||||
]; |
||||
var a, b, c; |
||||
switch(this.pickerPosition.toLowerCase()) { |
||||
case 'left': a=1; b=0; c=-1; break; |
||||
case 'right':a=1; b=0; c=1; break; |
||||
case 'top': a=0; b=1; c=-1; break; |
||||
default: a=0; b=1; c=1; break; |
||||
} |
||||
var l = (ts[b]+ps[b])/2; |
||||
var pp = [ // picker pos
|
||||
-vp[a]+tp[a]+ps[a] > vs[a] ? |
||||
(-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : |
||||
tp[a], |
||||
-vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? |
||||
(-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : |
||||
(tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) |
||||
]; |
||||
drawPicker(pp[a], pp[b]); |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.importColor = function() { |
||||
if(!valueElement) { |
||||
this.exportColor(); |
||||
} else { |
||||
if(!this.adjust) { |
||||
if(!this.fromString(valueElement.value, leaveValue)) { |
||||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; |
||||
styleElement.style.color = styleElement.jscStyle.color; |
||||
this.exportColor(leaveValue | leaveStyle); |
||||
} |
||||
} else if(!this.required && /^\s*$/.test(valueElement.value)) { |
||||
valueElement.value = ''; |
||||
styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; |
||||
styleElement.style.color = styleElement.jscStyle.color; |
||||
this.exportColor(leaveValue | leaveStyle); |
||||
|
||||
} else if(this.fromString(valueElement.value)) { |
||||
// OK
|
||||
} else { |
||||
this.exportColor(); |
||||
} |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.exportColor = function(flags) { |
||||
if(!(flags & leaveValue) && valueElement) { |
||||
var value = this.toString(); |
||||
if(this.caps) { value = value.toUpperCase(); } |
||||
if(this.hash) { value = '#'+value; } |
||||
valueElement.value = value; |
||||
} |
||||
if(!(flags & leaveStyle) && styleElement) { |
||||
styleElement.style.backgroundColor = |
||||
'#'+this.toString(); |
||||
styleElement.style.color = |
||||
0.213 * this.rgb[0] + |
||||
0.715 * this.rgb[1] + |
||||
0.072 * this.rgb[2] |
||||
< 0.5 ? '#FFF' : '#000'; |
||||
} |
||||
if(!(flags & leavePad) && isPickerOwner()) { |
||||
redrawPad(); |
||||
} |
||||
if(!(flags & leaveSld) && isPickerOwner()) { |
||||
redrawSld(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.fromHSV = function(h, s, v, flags) { // null = don't change
|
||||
h<0 && (h=0) || h>6 && (h=6); |
||||
s<0 && (s=0) || s>1 && (s=1); |
||||
v<0 && (v=0) || v>1 && (v=1); |
||||
this.rgb = HSV_RGB( |
||||
h===null ? this.hsv[0] : (this.hsv[0]=h), |
||||
s===null ? this.hsv[1] : (this.hsv[1]=s), |
||||
v===null ? this.hsv[2] : (this.hsv[2]=v) |
||||
); |
||||
this.exportColor(flags); |
||||
}; |
||||
|
||||
|
||||
this.fromRGB = function(r, g, b, flags) { // null = don't change
|
||||
r<0 && (r=0) || r>1 && (r=1); |
||||
g<0 && (g=0) || g>1 && (g=1); |
||||
b<0 && (b=0) || b>1 && (b=1); |
||||
var hsv = RGB_HSV( |
||||
r===null ? this.rgb[0] : (this.rgb[0]=r), |
||||
g===null ? this.rgb[1] : (this.rgb[1]=g), |
||||
b===null ? this.rgb[2] : (this.rgb[2]=b) |
||||
); |
||||
if(hsv[0] !== null) { |
||||
this.hsv[0] = hsv[0]; |
||||
} |
||||
if(hsv[2] !== 0) { |
||||
this.hsv[1] = hsv[1]; |
||||
} |
||||
this.hsv[2] = hsv[2]; |
||||
this.exportColor(flags); |
||||
}; |
||||
|
||||
|
||||
this.fromString = function(hex, flags) { |
||||
var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i); |
||||
if(!m) { |
||||
return false; |
||||
} else { |
||||
if(m[1].length === 6) { // 6-char notation
|
||||
this.fromRGB( |
||||
parseInt(m[1].substr(0,2),16) / 255, |
||||
parseInt(m[1].substr(2,2),16) / 255, |
||||
parseInt(m[1].substr(4,2),16) / 255, |
||||
flags |
||||
); |
||||
} else { // 3-char notation
|
||||
this.fromRGB( |
||||
parseInt(m[1].charAt(0)+m[1].charAt(0),16) / 255, |
||||
parseInt(m[1].charAt(1)+m[1].charAt(1),16) / 255, |
||||
parseInt(m[1].charAt(2)+m[1].charAt(2),16) / 255, |
||||
flags |
||||
); |
||||
} |
||||
return true; |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.toString = function() { |
||||
return ( |
||||
(0x100 | Math.round(255*this.rgb[0])).toString(16).substr(1) + |
||||
(0x100 | Math.round(255*this.rgb[1])).toString(16).substr(1) + |
||||
(0x100 | Math.round(255*this.rgb[2])).toString(16).substr(1) |
||||
); |
||||
}; |
||||
|
||||
|
||||
function RGB_HSV(r, g, b) { |
||||
var n = Math.min(Math.min(r,g),b); |
||||
var v = Math.max(Math.max(r,g),b); |
||||
var m = v - n; |
||||
if(m === 0) { return [ null, 0, v ]; } |
||||
var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); |
||||
return [ h===6?0:h, m/v, v ]; |
||||
} |
||||
|
||||
|
||||
function HSV_RGB(h, s, v) { |
||||
if(h === null) { return [ v, v, v ]; } |
||||
var i = Math.floor(h); |
||||
var f = i%2 ? h-i : 1-(h-i); |
||||
var m = v * (1 - s); |
||||
var n = v * (1 - s*f); |
||||
switch(i) { |
||||
case 6: |
||||
case 0: return [v,n,m]; |
||||
case 1: return [n,v,m]; |
||||
case 2: return [m,v,n]; |
||||
case 3: return [m,n,v]; |
||||
case 4: return [n,m,v]; |
||||
case 5: return [v,m,n]; |
||||
} |
||||
} |
||||
|
||||
|
||||
function removePicker() { |
||||
delete jscolor.picker.owner; |
||||
document.getElementsByTagName('body')[0].removeChild(jscolor.picker.boxB); |
||||
} |
||||
|
||||
|
||||
function drawPicker(x, y) { |
||||
if(!jscolor.picker) { |
||||
jscolor.picker = { |
||||
box : document.createElement('div'), |
||||
boxB : document.createElement('div'), |
||||
pad : document.createElement('div'), |
||||
padB : document.createElement('div'), |
||||
padM : document.createElement('div'), |
||||
sld : document.createElement('div'), |
||||
sldB : document.createElement('div'), |
||||
sldM : document.createElement('div') |
||||
}; |
||||
for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) { |
||||
var seg = document.createElement('div'); |
||||
seg.style.height = segSize+'px'; |
||||
seg.style.fontSize = '1px'; |
||||
seg.style.lineHeight = '0'; |
||||
jscolor.picker.sld.appendChild(seg); |
||||
} |
||||
jscolor.picker.sldB.appendChild(jscolor.picker.sld); |
||||
jscolor.picker.box.appendChild(jscolor.picker.sldB); |
||||
jscolor.picker.box.appendChild(jscolor.picker.sldM); |
||||
jscolor.picker.padB.appendChild(jscolor.picker.pad); |
||||
jscolor.picker.box.appendChild(jscolor.picker.padB); |
||||
jscolor.picker.box.appendChild(jscolor.picker.padM); |
||||
jscolor.picker.boxB.appendChild(jscolor.picker.box); |
||||
} |
||||
|
||||
var p = jscolor.picker; |
||||
|
||||
// recompute controls positions
|
||||
posPad = [ |
||||
x+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset, |
||||
y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ]; |
||||
posSld = [ |
||||
null, |
||||
y+THIS.pickerBorder+THIS.pickerFace+THIS.pickerInset ]; |
||||
|
||||
// controls interaction
|
||||
p.box.onmouseup = |
||||
p.box.onmouseout = function() { target.focus(); }; |
||||
p.box.onmousedown = function() { abortBlur=true; }; |
||||
p.box.onmousemove = function(e) { holdPad && setPad(e); holdSld && setSld(e); }; |
||||
p.padM.onmouseup = |
||||
p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } }; |
||||
p.padM.onmousedown = function(e) { holdPad=true; setPad(e); }; |
||||
p.sldM.onmouseup = |
||||
p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } }; |
||||
p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); }; |
||||
|
||||
// picker
|
||||
p.box.style.width = 4*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] + 'px'; |
||||
p.box.style.height = 2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1] + 'px'; |
||||
|
||||
// picker border
|
||||
p.boxB.style.position = 'absolute'; |
||||
p.boxB.style.clear = 'both'; |
||||
p.boxB.style.left = x+'px'; |
||||
p.boxB.style.top = y+'px'; |
||||
p.boxB.style.zIndex = THIS.pickerZIndex; |
||||
p.boxB.style.border = THIS.pickerBorder+'px solid'; |
||||
p.boxB.style.borderColor = THIS.pickerBorderColor; |
||||
p.boxB.style.background = THIS.pickerFaceColor; |
||||
|
||||
// pad image
|
||||
p.pad.style.width = jscolor.images.pad[0]+'px'; |
||||
p.pad.style.height = jscolor.images.pad[1]+'px'; |
||||
|
||||
// pad border
|
||||
p.padB.style.position = 'absolute'; |
||||
p.padB.style.left = THIS.pickerFace+'px'; |
||||
p.padB.style.top = THIS.pickerFace+'px'; |
||||
p.padB.style.border = THIS.pickerInset+'px solid'; |
||||
p.padB.style.borderColor = THIS.pickerInsetColor; |
||||
|
||||
// pad mouse area
|
||||
p.padM.style.position = 'absolute'; |
||||
p.padM.style.left = '0'; |
||||
p.padM.style.top = '0'; |
||||
p.padM.style.width = THIS.pickerFace + 2*THIS.pickerInset + jscolor.images.pad[0] + jscolor.images.arrow[0] + 'px'; |
||||
p.padM.style.height = p.box.style.height; |
||||
p.padM.style.cursor = 'crosshair'; |
||||
|
||||
// slider image
|
||||
p.sld.style.overflow = 'hidden'; |
||||
p.sld.style.width = jscolor.images.sld[0]+'px'; |
||||
p.sld.style.height = jscolor.images.sld[1]+'px'; |
||||
|
||||
// slider border
|
||||
p.sldB.style.position = 'absolute'; |
||||
p.sldB.style.right = THIS.pickerFace+'px'; |
||||
p.sldB.style.top = THIS.pickerFace+'px'; |
||||
p.sldB.style.border = THIS.pickerInset+'px solid'; |
||||
p.sldB.style.borderColor = THIS.pickerInsetColor; |
||||
|
||||
// slider mouse area
|
||||
p.sldM.style.position = 'absolute'; |
||||
p.sldM.style.right = '0'; |
||||
p.sldM.style.top = '0'; |
||||
p.sldM.style.width = jscolor.images.sld[0] + jscolor.images.arrow[0] + THIS.pickerFace + 2*THIS.pickerInset + 'px'; |
||||
p.sldM.style.height = p.box.style.height; |
||||
try { |
||||
p.sldM.style.cursor = 'pointer'; |
||||
} catch(eOldIE) { |
||||
p.sldM.style.cursor = 'hand'; |
||||
} |
||||
|
||||
// load images in optimal order
|
||||
switch(modeID) { |
||||
case 0: var padImg = 'hs.png'; break; |
||||
case 1: var padImg = 'hv.png'; break; |
||||
} |
||||
p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat"; |
||||
p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat"; |
||||
p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat"; |
||||
|
||||
// place pointers
|
||||
redrawPad(); |
||||
redrawSld(); |
||||
|
||||
jscolor.picker.owner = THIS; |
||||
document.getElementsByTagName('body')[0].appendChild(p.boxB); |
||||
} |
||||
|
||||
|
||||
function redrawPad() { |
||||
// redraw the pad pointer
|
||||
switch(modeID) { |
||||
case 0: var yComponent = 1; break; |
||||
case 1: var yComponent = 2; break; |
||||
} |
||||
var x = Math.round((THIS.hsv[0]/6) * (jscolor.images.pad[0]-1)); |
||||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.pad[1]-1)); |
||||
jscolor.picker.padM.style.backgroundPosition = |
||||
(THIS.pickerFace+THIS.pickerInset+x - Math.floor(jscolor.images.cross[0]/2)) + 'px ' + |
||||
(THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.cross[1]/2)) + 'px'; |
||||
|
||||
// redraw the slider image
|
||||
var seg = jscolor.picker.sld.childNodes; |
||||
|
||||
switch(modeID) { |
||||
case 0: |
||||
var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1); |
||||
for(var i=0; i<seg.length; i+=1) { |
||||
seg[i].style.backgroundColor = 'rgb('+ |
||||
(rgb[0]*(1-i/seg.length)*100)+'%,'+ |
||||
(rgb[1]*(1-i/seg.length)*100)+'%,'+ |
||||
(rgb[2]*(1-i/seg.length)*100)+'%)'; |
||||
} |
||||
break; |
||||
case 1: |
||||
var rgb, s, c = [ THIS.hsv[2], 0, 0 ]; |
||||
var i = Math.floor(THIS.hsv[0]); |
||||
var f = i%2 ? THIS.hsv[0]-i : 1-(THIS.hsv[0]-i); |
||||
switch(i) { |
||||
case 6: |
||||
case 0: rgb=[0,1,2]; break; |
||||
case 1: rgb=[1,0,2]; break; |
||||
case 2: rgb=[2,0,1]; break; |
||||
case 3: rgb=[2,1,0]; break; |
||||
case 4: rgb=[1,2,0]; break; |
||||
case 5: rgb=[0,2,1]; break; |
||||
} |
||||
for(var i=0; i<seg.length; i+=1) { |
||||
s = 1 - 1/(seg.length-1)*i; |
||||
c[1] = c[0] * (1 - s*f); |
||||
c[2] = c[0] * (1 - s); |
||||
seg[i].style.backgroundColor = 'rgb('+ |
||||
(c[rgb[0]]*100)+'%,'+ |
||||
(c[rgb[1]]*100)+'%,'+ |
||||
(c[rgb[2]]*100)+'%)'; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
|
||||
function redrawSld() { |
||||
// redraw the slider pointer
|
||||
switch(modeID) { |
||||
case 0: var yComponent = 2; break; |
||||
case 1: var yComponent = 1; break; |
||||
} |
||||
var y = Math.round((1-THIS.hsv[yComponent]) * (jscolor.images.sld[1]-1)); |
||||
jscolor.picker.sldM.style.backgroundPosition = |
||||
'0 ' + (THIS.pickerFace+THIS.pickerInset+y - Math.floor(jscolor.images.arrow[1]/2)) + 'px'; |
||||
} |
||||
|
||||
|
||||
function isPickerOwner() { |
||||
return jscolor.picker && jscolor.picker.owner === THIS; |
||||
} |
||||
|
||||
|
||||
function blurTarget() { |
||||
if(valueElement === target) { |
||||
THIS.importColor(); |
||||
} |
||||
if(THIS.pickerOnfocus) { |
||||
THIS.hidePicker(); |
||||
} |
||||
} |
||||
|
||||
|
||||
function blurValue() { |
||||
if(valueElement !== target) { |
||||
THIS.importColor(); |
||||
} |
||||
} |
||||
|
||||
|
||||
function setPad(e) { |
||||
var posM = jscolor.getMousePos(e); |
||||
var x = posM[0]-posPad[0]; |
||||
var y = posM[1]-posPad[1]; |
||||
switch(modeID) { |
||||
case 0: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), 1 - y/(jscolor.images.pad[1]-1), null, leaveSld); break; |
||||
case 1: THIS.fromHSV(x*(6/(jscolor.images.pad[0]-1)), null, 1 - y/(jscolor.images.pad[1]-1), leaveSld); break; |
||||
} |
||||
} |
||||
|
||||
|
||||
function setSld(e) { |
||||
var posM = jscolor.getMousePos(e); |
||||
var y = posM[1]-posPad[1]; |
||||
switch(modeID) { |
||||
case 0: THIS.fromHSV(null, null, 1 - y/(jscolor.images.sld[1]-1), leavePad); break; |
||||
case 1: THIS.fromHSV(null, 1 - y/(jscolor.images.sld[1]-1), null, leavePad); break; |
||||
} |
||||
} |
||||
|
||||
|
||||
var THIS = this; |
||||
var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0; |
||||
var abortBlur = false; |
||||
var |
||||
valueElement = jscolor.fetchElement(this.valueElement), |
||||
styleElement = jscolor.fetchElement(this.styleElement); |
||||
var |
||||
holdPad = false, |
||||
holdSld = false; |
||||
var |
||||
posPad, |
||||
posSld; |
||||
var |
||||
leaveValue = 1<<0, |
||||
leaveStyle = 1<<1, |
||||
leavePad = 1<<2, |
||||
leaveSld = 1<<3; |
||||
|
||||
// target
|
||||
jscolor.addEvent(target, 'focus', function() { |
||||
if(THIS.pickerOnfocus) { THIS.showPicker(); } |
||||
}); |
||||
jscolor.addEvent(target, 'blur', function() { |
||||
if(!abortBlur) { |
||||
window.setTimeout(function(){ abortBlur || blurTarget(); abortBlur=false; }, 0); |
||||
} else { |
||||
abortBlur = false; |
||||
} |
||||
}); |
||||
|
||||
// valueElement
|
||||
if(valueElement) { |
||||
var updateField = function() { |
||||
THIS.fromString(valueElement.value, leaveValue); |
||||
}; |
||||
jscolor.addEvent(valueElement, 'keyup', updateField); |
||||
jscolor.addEvent(valueElement, 'input', updateField); |
||||
jscolor.addEvent(valueElement, 'blur', blurValue); |
||||
valueElement.setAttribute('autocomplete', 'off'); |
||||
} |
||||
|
||||
// styleElement
|
||||
if(styleElement) { |
||||
styleElement.jscStyle = { |
||||
backgroundColor : styleElement.style.backgroundColor, |
||||
color : styleElement.style.color |
||||
}; |
||||
} |
||||
|
||||
// require images
|
||||
switch(modeID) { |
||||
case 0: jscolor.requireImage('hs.png'); break; |
||||
case 1: jscolor.requireImage('hv.png'); break; |
||||
} |
||||
jscolor.requireImage('cross.gif'); |
||||
jscolor.requireImage('arrow.gif'); |
||||
|
||||
this.importColor(); |
||||
} |
||||
|
||||
}; |
||||
|
||||
|
||||
jscolor.install(); |
@ -1,483 +0,0 @@ |
||||
<?php |
||||
/***************************************************************************** |
||||
$Id: yapter.php,v 1.24 2006/01/31 07:30:28 nvie Exp $ |
||||
|
||||
Yapter 2.14b2 - Yet Another PHP Template Engine ® |
||||
Copyright (C) 2001-2003 Vincent Driessen |
||||
|
||||
This library is free software; you can redistribute it and/or |
||||
modify it under the terms of the GNU Lesser General Public |
||||
License as published by the Free Software Foundation; either |
||||
version 2.1 of the License, or (at your option) any later version. |
||||
|
||||
This library is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
Lesser General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU Lesser General Public |
||||
License along with this library; if not, write to the Free Software |
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||
|
||||
For more information, visit http://yapter.sf.net/ or contact us at |
||||
nvie@users.sourceforge.net |
||||
The full terms of the GNU Lesser General Public License that apply to Yapter |
||||
can be found at http://yapter.sf.net/LICENSE |
||||
*****************************************************************************/ |
||||
|
||||
// Define Yapter's warning levels |
||||
define('E_YAPTER_NONE', 0); // Be completely silent |
||||
define('E_YAPTER_NOTICE', 1); // Report notices |
||||
define('E_YAPTER_WARNING', 2); // Report warnings |
||||
define('E_YAPTER_ERROR', 4); // Report errors |
||||
define('E_YAPTER_DIE_ON_ERROR', 8); // Die on errors |
||||
define('E_YAPTER_ALL', 15); // Report errors, warnings and notices |
||||
|
||||
// Define Yapter's ignore levels |
||||
define('E_YAPTER_IGN_UNKNOWN_VARS', 16); // Ignore unknown variables |
||||
define('E_YAPTER_AUTO_HIDE_BLOCK', 32); // Automaticly hide unparsed blocks |
||||
|
||||
class Template { |
||||
var $_ROOT = '__DOCUMENT_ROOT'; |
||||
var $parseUnknownVars = false; // Defines whether unknown variables should be removed or left alone |
||||
var $blox = array(); // $blox[blockname]['content'] holds the template's content |
||||
// $blox[blockname]['numlines'] holds the number of lines in the block |
||||
// $blox[blockname]['parsed'] holds an array with the parsed data |
||||
// $blox[$_ROOT] always holds the main template |
||||
var $blockDefs = array(); // Keeps track of all block-definitions from which multiple blocks... |
||||
// ...can be created instances of |
||||
|
||||
var $vars = array(); // This array contains all variables. All are accessible from all blocks. |
||||
|
||||
var $warningLevel; // The level of verbosity Yapter complies with (see the E_* defines above) |
||||
var $startTime; // Holds the start time of the script, so that it can compare it to the... |
||||
// ...end time to calculate the execution time. (For debugging purposes only.) |
||||
|
||||
var $missing_list; // List of variable names that are declared but never set. |
||||
|
||||
///////////////////////////////////////////////////////////////////// |
||||
|
||||
function error($msg) |
||||
{ |
||||
if ($this->warningLevel & E_YAPTER_ERROR) |
||||
if ($this->warningLevel & E_YAPTER_DIE_ON_ERROR ) |
||||
// if DIE_ON_ERROR is set, then do die on error! |
||||
die("<br />\n<b>Yapter error</b>: ".$msg."<br />\n"); // Die here! |
||||
else |
||||
// else just barf out the message |
||||
echo "<br />\n<b>Yapter error</b>: ".$msg."<br />\n"; |
||||
} |
||||
|
||||
function warning($msg) |
||||
{ |
||||
if ($this->warningLevel & E_YAPTER_WARNING) |
||||
echo "<br />\n<b>Yapter warning</b>: ".$msg."<br />\n"; |
||||
} |
||||
|
||||
function notice($msg) |
||||
{ |
||||
if ($this->warningLevel & E_YAPTER_NOTICE) |
||||
echo "<br />\n<b>Yapter notice</b>: ".$msg."<br />\n"; |
||||
} |
||||
|
||||
function warn_var_not_set($varname) |
||||
{ |
||||
if (!in_array($varname, $this->missing_list) && !($this->warningLevel & E_YAPTER_IGN_UNKNOWN_VARS)) { |
||||
$this->missing_list[] = $varname; // Add it to the list... |
||||
// ...and print a warning once. |
||||
$this->warning('Variable <b>'.htmlspecialchars($varname).'</b> found, but never assigned a value. (This message is shown only once for each variable.)'); |
||||
} |
||||
} |
||||
|
||||
///////////////////////////////////////////////////////////////////// |
||||
|
||||
function Template($file, $level = E_YAPTER_ALL) |
||||
{ |
||||
if (is_bool($level)) { |
||||
// |
||||
// Rationale: |
||||
// ========= |
||||
// Older Yapter versions had the possibility of turning |
||||
// on the so called "debug mode" with a bool parameter |
||||
// as the second argument to this constructor. |
||||
// However, since debug mode was dropped and the |
||||
// warning level support was built in, it was a logical |
||||
// step of replacing the second parameter. |
||||
// |
||||
// However, to prevent people from making mistakes, |
||||
// we'll check if the user passed a boolean parameter. |
||||
// If so, he or she is probably using debug mode, and |
||||
// we'll issue a notice in these cases. |
||||
// |
||||
// Thanks to Ivo Koster. |
||||
// |
||||
$this->notice('Debug mode is not supported anymore since Yapter version 2.12.'); |
||||
$this->warningLevel = E_YAPTER_ALL; |
||||
} |
||||
else |
||||
$this->warningLevel = (int)$level; |
||||
|
||||
$this->startTime = $this->getmicrotime(); |
||||
$this->addBlockFromFile($this->_ROOT, $file); |
||||
$this->missing_list = array(); |
||||
} |
||||
|
||||
/* setParseMode(): specifies to parse unknown variables or not */ |
||||
function setParseMode($parseUnknownVars) |
||||
{ |
||||
$this->parseUnknownVars = (bool)$parseUnknownVars; |
||||
} |
||||
|
||||
/* setWarningLevel(): sets the level of verbosity which Yapter should obey */ |
||||
function setWarningLevel($level) |
||||
{ |
||||
$this->warningLevel = $level; |
||||
} |
||||
|
||||
/* addBlock(): adds a new block to the blox-array */ |
||||
function addBlock($blockname, $content) |
||||
{ |
||||
$this->blox[$blockname]['content'] = $content; |
||||
$this->blox[$blockname]['numlines'] = sizeof($this->blox[$blockname]['content']); |
||||
$this->blox[$blockname]['parsed'] = ''; |
||||
$this->prepare($blockname); |
||||
} |
||||
|
||||
/* addBlockFromFile(): adds a new block, filling it with the specified's file contents */ |
||||
function addBlockFromFile($blockname, $file) |
||||
{ |
||||
$content = @file($file) or $this->error('Cannot open template file <b>'.htmlspecialchars($file).'</b>!'); |
||||
//--- eliminate double block def mod -klp |
||||
// if ($blockname != $this->_ROOT) |
||||
// $this->addBlockDef($blockname, $content); |
||||
$this->addBlock($blockname, $content); |
||||
} |
||||
|
||||
/* addBlockDef(): adds a block definition to the block-definition array from which other blocks can be copied */ |
||||
function addBlockDef($blockdef, $content) |
||||
{ |
||||
/* if (isset($this->blockDefs[$blockdef])) |
||||
$this->error('Block "'.htmlspecialchars($blockdef).'" allready exists. I cannot create it twice.'); |
||||
else |
||||
$this->blockDefs[$blockdef] = $content; |
||||
*/ |
||||
$this->blockDefs[$blockdef] = $content; |
||||
} |
||||
|
||||
/* addBlockFromDef(): copies a block from the block definition array */ |
||||
function addBlockFromDef($blockname, $blockdef) |
||||
{ |
||||
$this->addBlock($blockname, $this->blockDefs[$blockdef]); |
||||
} |
||||
|
||||
/* prepare(): handles subprocessing of templates found in the main template file */ |
||||
function prepare($blockname) |
||||
{ |
||||
$currblockcontents = array(); |
||||
$block = &$this->blox[$blockname]; |
||||
for ($i = 0; $i < $block['numlines']; $i++) { |
||||
if (isset($block['content'][$i])) |
||||
$line = $block['content'][$i]; |
||||
else |
||||
continue; |
||||
|
||||
// Try to find a tag-definition on this line |
||||
if (preg_match('/\[(INCLUDE|BLOCK|END|REUSE|SET) ([A-Za-z0-9_.\/-]+)( AS ([A-Za-z0-9_-]+))?]/', $line, $matches)) { |
||||
$type = $matches[1]; |
||||
$name = (!empty($matches[4])) ? $matches[4] : $matches[2]; |
||||
if ($type == 'END' && !isset($currblockdef)) |
||||
$this->error('"[END '.$name.']" found without matching "[BLOCK '.$name.']" or "[SET '.$name.']"'); |
||||
if ($type == 'END' && $matches[2] == $currblockdef) { |
||||
if (isset($matches[4])) |
||||
$this->error('Given "AS"-parameter not allowed in END-tags!'); |
||||
|
||||
// End the current block definition: add the block to the blox-array |
||||
//--- if wrapper mod -klp |
||||
if (isset($currblockdef) && isset($currblockcontents) && isset($currblockname)) { |
||||
$this->addBlockDef($currblockdef, $currblockcontents); |
||||
$this->addBlockFromDef($currblockname, $currblockdef); |
||||
} |
||||
|
||||
// Now, try to remove the block from the template definition, replacing it with a var |
||||
for ($j = $i; $j >= $currblockstart; $j--) { |
||||
if ($j == $currblockstart && $currblocktype == 'BLOCK') |
||||
$block['content'][$j] = "{" . $currblockname . "}"; |
||||
else |
||||
unset($block['content'][$j]); |
||||
} |
||||
|
||||
// unset these thingies for further preparing |
||||
unset($currblocktype); |
||||
unset($currblockstart); |
||||
unset($currblockname); |
||||
unset($currblockdef); |
||||
$currblockcontents = array(); |
||||
|
||||
} elseif (($type == 'SET' || $type == 'BLOCK') && !isset($currblockname)) { |
||||
|
||||
if ($type == 'BLOCK') { |
||||
|
||||
// Start block definition |
||||
$currblocktype = $type; |
||||
$currblockstart = $i; |
||||
$currblockname = $name; |
||||
$currblockdef = $matches[2]; |
||||
|
||||
} else { // SET-tag |
||||
|
||||
// Start block definition |
||||
if (isset($matches[4])) |
||||
$this->error('Given "AS"-parameter not allowed in SET-tags!'); |
||||
|
||||
$currblocktype = $type; |
||||
$currblockstart = $i; |
||||
$currblockname = $matches[2]; |
||||
$currblockdef = $matches[2]; |
||||
|
||||
} |
||||
|
||||
} elseif ($type == 'INCLUDE' && !isset($currblockname)) { |
||||
|
||||
// Make this line a variable... |
||||
$block['content'][$i] = "{" . $name . "}\n"; |
||||
|
||||
// ...and include the given file... |
||||
$this->addBlockFromFile($name, $matches[2]); |
||||
|
||||
} elseif ($type == 'REUSE' && !isset($currblockname)) { |
||||
|
||||
if (!isset($matches[4])) |
||||
$this->error('Missing "AS"-parameter in [REUSE <b>$name</b>] tag!'); |
||||
|
||||
// Make this line a variable... |
||||
$block['content'][$i] = "{" . $matches[4] . "}\n"; |
||||
|
||||
// ...and get this REUSE value from the block definition list... |
||||
$this->addBlockFromDef($matches[4], $matches[2]); |
||||
|
||||
} elseif ($currblockname != $name) { |
||||
if ($currblockname) |
||||
$currblockcontents[] = $line; |
||||
} |
||||
|
||||
} else { |
||||
// No tag-definition... just normal text so do nothing here |
||||
if (!empty($currblockname)) |
||||
$currblockcontents[] = $line; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* parse(): parses the specified block, filling variables and nested blockdefs */ |
||||
function parse($blockname = '') |
||||
{ |
||||
if (!$blockname) |
||||
$blockname = $this->_ROOT; |
||||
if (!isset($this->blox[$blockname])) |
||||
$this->error('Block "'.htmlspecialchars($blockname).'" does not exist.'); |
||||
|
||||
$block = &$this->blox[$blockname]; |
||||
$parsed = $block['content']; |
||||
|
||||
// Loop through all the lines of the template and parse variables one-by-one |
||||
for ($i = 0; $i < $block['numlines']; $i++) { |
||||
if (!isset($parsed[$i])) |
||||
continue; |
||||
$line = $parsed[$i]; |
||||
|
||||
// Look for variables in this line, processing it character-by-character |
||||
unset($start); |
||||
unset($buffer); |
||||
for ($j = 0; $j < strlen($line); $j++) { |
||||
$char = $line[$j]; |
||||
if (!isset($start) && $char == '{') |
||||
$start = $j; |
||||
elseif (isset($start) && $char == '}') { |
||||
// The sequence {} is not a valid variable value |
||||
if (!isset($buffer)) { |
||||
unset($start); |
||||
continue; |
||||
} else { |
||||
// Gotcha! Now replace this variable with its contents |
||||
// First, check to see if it's a variable or a block that has to be parsed |
||||
if (isset($this->vars[$buffer])) |
||||
$value = $this->vars[$buffer]; |
||||
elseif (isset($this->blox[$buffer])) { |
||||
if ($this->blox[$buffer]['parsed']) { |
||||
// The value must be filled with the parsed data from the $buffer block |
||||
$value = @implode('', $this->blox[$buffer]['parsed']); |
||||
} elseif ($this->warningLevel & E_YAPTER_AUTO_HIDE_BLOCK) { |
||||
// Automaticly hide unparsed bloks |
||||
$value = ""; |
||||
} else { |
||||
// Make the recursive call now |
||||
$value = @implode('', $this->parse($buffer)); |
||||
} |
||||
} else { |
||||
// No variable or block name found by the name of $buffer |
||||
|
||||
// First, issue a warning! |
||||
$this->warn_var_not_set($buffer); |
||||
|
||||
if ($this->parseUnknownVars) { |
||||
// Unable to find variable, replace this one with an empty |
||||
// string silently. |
||||
$value = ''; |
||||
} else { |
||||
// Unable to find variable, leave this one alone... |
||||
unset($start); |
||||
unset($buffer); |
||||
continue; |
||||
} |
||||
} |
||||
$part1 = substr($line, 0, $start); |
||||
$part2 = substr($line, $start + strlen($buffer) + 2); |
||||
$line = $part1 . $value . $part2; |
||||
$j += strlen($value) - (strlen($buffer) + 2); |
||||
unset($start); |
||||
unset($buffer); |
||||
} |
||||
} elseif (isset($start)) { |
||||
// Check to see $char is a proper character (range: [A-Za-z0-9_./-]) |
||||
// In Yapter 2.13b2, I've added the '/' char as well, to support inclusion |
||||
// from Unix paths, like '../../foo.tpl' |
||||
if (($char >= 'a' && $char <= 'z') || ($char >= '0' && $char <= '9') || ($char >= 'A' && $char <= 'Z') || ($char == '_') || ($char == '.') || ($char == '-') || ($char == '/')) { |
||||
if (!empty($buffer)) |
||||
$buffer .= $char; |
||||
else |
||||
$buffer = $char; |
||||
} else { |
||||
unset($start); |
||||
unset($buffer); |
||||
} |
||||
} |
||||
} |
||||
$parsed[$i] = $line; |
||||
} |
||||
|
||||
if (is_array($this->blox[$blockname]['parsed'])) { |
||||
$this->blox[$blockname]['parsed'] = array_merge($this->blox[$blockname]['parsed'], $parsed); |
||||
} else { |
||||
//--- array cast mod -klp |
||||
$this->blox[$blockname]['parsed'] = (array) $parsed; |
||||
} |
||||
return $this->blox[$blockname]['parsed']; |
||||
} |
||||
|
||||
/* set(): assigns a value to a variabele inside curly brackets ('{' and '}') */ |
||||
function set($varname, $value) |
||||
{ |
||||
if (isset($value)) |
||||
$this->vars[$varname] = $value; |
||||
else |
||||
$this->warning('Trying to set <b>'.htmlspecialchars($varname).'</b> to NULL. Variable not set.'); |
||||
} |
||||
|
||||
/* setVars(): assigns values to variables for each element in the given array |
||||
Contributed by: Raniz |
||||
*/ |
||||
function setVars($variables) |
||||
{ |
||||
if (!is_array($variables)) |
||||
$this->error('Value passed to setVars is not an array.'); |
||||
foreach($variables as $varname => $value) |
||||
$this->vars[$varname] = $value; |
||||
} |
||||
|
||||
/* setFile(): assigns the contents of a file to a variabele inside curly brackets ('{' and '}') */ |
||||
function setFile($varname, $filename) |
||||
{ |
||||
if (!file_exists($filename)) |
||||
$this->error('Cannot open file "'.htmlspecialchars($filename).'" for inclusion in "'.htmlspecialchars($varname).'".'); |
||||
$value = implode('', file($filename)); |
||||
$this->set($varname, $value); |
||||
} |
||||
|
||||
/* getVar(): returns the value of the 'varname' variable */ |
||||
function getVar($varname) |
||||
{ |
||||
if ($this->vars[$varname]) |
||||
return $this->vars[$varname]; |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
/* getBlock(): returns the content of the 'blockname' block */ |
||||
function getBlockContent($blockname) |
||||
{ |
||||
if ($this->$blox[$blockname]['content']) |
||||
return @implode('', $this->$blox[$blockname]['content']); |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
/* replace(): replaces the content of one block by another */ |
||||
function replace($block, $byblock) |
||||
{ |
||||
if (!isset($this->blox[$block])) |
||||
$this->error('Block "'.htmlspecialchars($block).'" does not exist.'); |
||||
if (!isset($this->blox[$byblock])) |
||||
$this->error('Block "'.htmlspecialchars($block).'" does not exist.'); |
||||
$this->blox[$block]['content'] = $this->blox[$byblock]['content']; |
||||
$this->blox[$block]['numlines'] = $this->blox[$byblock]['numlines']; |
||||
} |
||||
|
||||
/* hide(): hides all the contents of the given block */ |
||||
function hide($block) |
||||
{ |
||||
if (!isset($this->blox[$block])) |
||||
$this->error('Block "'.htmlspecialchars($block).'" does not exist.'); |
||||
$this->blox[$block]['content'] = array(); |
||||
$this->blox[$block]['numlines'] = 0; |
||||
} |
||||
|
||||
/* clear(): resets the parsed data to an empty string again and defines the block as 'unparsed' */ |
||||
function clear($blockname) |
||||
{ |
||||
if (!isset($this->blox[$blockname])) |
||||
$this->error('Block "'.htmlspecialchars($blockname).'" does not exist.'); |
||||
$this->blox[$blockname]['parsed'] = ''; |
||||
unset($this->vars[$blockname]); // often, a variabele is set whenever a block should be discarded... |
||||
// ...now reset such a variable to make sure the block is not overriden |
||||
} |
||||
|
||||
/* getContents(): gets the final contents to be outputted on the screen */ |
||||
function getContents($blockname = '') |
||||
{ |
||||
if ($blockname == '') $blockname = $this->_ROOT; |
||||
$parsed = $this->blox[$blockname]['parsed']; |
||||
if ($parsed) |
||||
return implode('', $parsed); |
||||
else |
||||
return false; |
||||
} |
||||
|
||||
/* spit(): ouputs contents to screen */ |
||||
function spit() |
||||
{ |
||||
echo $this->getContents(); |
||||
} |
||||
|
||||
function getmicrotime() |
||||
{ |
||||
/* I got this getmicrotime()-function from the PHP.net website, but it seems to be |
||||
buggy, while it sometimes displays a negative execution time when you substract |
||||
the current time with the starting time of the script... I only noticed it at |
||||
my Windows localhost machine, not on *nix servers. Is anybody familiar with this |
||||
behaviour? Any information about this is welcome at nvie@users.sourceforge.net |
||||
for your co-operation. */ |
||||
list($usec, $sec) = explode(' ', microtime()); |
||||
return ((float)$usec + (float)$sec); |
||||
} |
||||
|
||||
function execTime() |
||||
{ |
||||
return round($this->getmicrotime() - $this->startTime, 5); |
||||
} |
||||
|
||||
function executionTime() |
||||
{ |
||||
echo "<p>\n\nThe execution time is <b>".$this->execTime()."</b> seconds.<br>\n"; |
||||
} |
||||
} |
||||
?> |