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 |
IP Reg Installation |
||||||
|
|
||||||
1. Create database |
1. Install requirements |
||||||
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. |
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 |
2. Create database |
||||||
Import the mysql.sql file into your database, which will create the tables and some sample data. |
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. |
Open config.php in a text editor and fill in your database details. |
||||||
|
|
||||||
4. Upload files |
5. Upload files |
||||||
Upload all files and directory's (except the install directory) to your webserver. |
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 |
7. Start using IP Reg |
||||||
Start your browser and login to IP Reg with the default username/password: admin/admin |
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 |
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"; |
|
||||||
} |
|
||||||
} |
|
||||||
?> |
|
@ -1,49 +1,53 @@ |
|||||||
<table class="title"> |
<table class="title"> |
||||||
<tr> |
<tr> |
||||||
<td class="header"> |
<td class="header"> |
||||||
{lang_assets} ({asset_counter}) |
{$lang_assets} ({$assets|@count}) |
||||||
</td> |
</td> |
||||||
<td align="right"> |
<td align="right"> |
||||||
<a href="assetadd.php"><img src="image.php?icon=add" alt="{lang_asset_add}"></a> |
<a href="assetadd.php"><img src="image.php?icon=add" alt="{$lang_asset_add}" {if $suser_tooltips}title="{$lang_asset_add}" {/if}/></a> |
||||||
</td> |
</td> |
||||||
</tr> |
</tr> |
||||||
</table> |
</table> |
||||||
|
|
||||||
<p> |
<table class="submenu initials"> |
||||||
|
|
||||||
[BLOCK letter_table AS letter_table] |
|
||||||
<table class="submenu"> |
|
||||||
<tr> |
<tr> |
||||||
[BLOCK letter_row] |
{foreach item=letter from=$alphabet} |
||||||
<td> |
<td> |
||||||
<a href="asset.php?asset_letter={asset_letter}">{asset_letter}</a> |
<a href="asset.php?asset_letter={$letter.asset_letter}">{$letter.asset_letter}</a> |
||||||
</td> |
</td> |
||||||
[END letter_row] |
{/foreach} |
||||||
</tr> |
</tr> |
||||||
</table> |
</table> |
||||||
[END letter_table] |
|
||||||
|
|
||||||
<p> |
|
||||||
|
|
||||||
[BLOCK asset_table AS asset_table] |
|
||||||
<table class="info"> |
<table class="info"> |
||||||
<tr> |
<tr> |
||||||
<td class="header"> |
<td class="header"> |
||||||
{lang_asset_name} |
{$lang_asset_name} |
||||||
</td> |
</td> |
||||||
<td class="header"> |
<td class="header"> |
||||||
{lang_assetclass_name} |
{$lang_assetclass_name} |
||||||
|
</td> |
||||||
|
<td class="header"> |
||||||
|
{$lang_asset_info} |
||||||
</td> |
</td> |
||||||
</tr> |
</tr> |
||||||
[BLOCK asset_row] |
{foreach item=asset from=$assets} |
||||||
<tr> |
<tr> |
||||||
<td class="label"> |
<td class="label"> |
||||||
<a href="assetview.php?asset_id={asset_id}">{asset_name}</a> |
<a href="assetview.php?asset.id={$asset.asset_id}">{$asset.asset_name}</a> |
||||||
</td> |
</td> |
||||||
<td class="value"> |
<td class="value"> |
||||||
<a href="assetclassview.php?assetclass_id={assetclass_id}">{assetclass_name}</a> |
<a href="assetclassview.php?assetclass_id={$asset.assetclass_id}">{$asset.assetclass_name}</a> |
||||||
|
</td> |
||||||
|
<td class="value"> |
||||||
|
{$asset.asset_info} |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
{foreachelse} |
||||||
|
<tr> |
||||||
|
<td colspan="2"> |
||||||
|
{$lang_asset_none} |
||||||
</td> |
</td> |
||||||
</tr> |
</tr> |
||||||
[END asset_row] |
{/foreach} |
||||||
</table> |
</table> |
||||||
[END asset_table] |
|