Moved towards smarty templates, support php7, switched to mysqli,
finalized language support and fixed some more bugs
This commit is contained in:
BIN
lib/arrow.gif
Normal file
BIN
lib/arrow.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 B |
@@ -1,5 +1,5 @@
|
||||
function changelink(optVal){
|
||||
if(optVal=="")
|
||||
return false;
|
||||
window.location='subnetview.php?subnet_id='+optVal;
|
||||
}
|
||||
function changelink(optVal) {
|
||||
if(optVal=="")
|
||||
return false;
|
||||
window.location='subnetview.php?subnet_id='+optVal;
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
function changetext(id,newtext) {
|
||||
document.getElementById(id).innerHTML=newtext
|
||||
}
|
||||
function changetext(id,newtext) {
|
||||
document.getElementById(id).innerHTML=newtext
|
||||
}
|
||||
BIN
lib/cross.gif
Normal file
BIN
lib/cross.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 B |
228
lib/db.class.php
228
lib/db.class.php
@@ -1,55 +1,173 @@
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
class Db {
|
||||
function db_delete($query) {
|
||||
// run query
|
||||
$sql = mysql_query($query) or die(mysql_error());
|
||||
}
|
||||
|
||||
function db_insert($query) {
|
||||
// run query
|
||||
$sql = mysql_query($query) or die(mysql_error());
|
||||
|
||||
// return result
|
||||
return mysql_insert_id();
|
||||
}
|
||||
|
||||
function db_select($query) {
|
||||
// run query
|
||||
$sql = mysql_query($query) or die(mysql_error());
|
||||
|
||||
// loop results
|
||||
while($record = mysql_fetch_assoc($sql)) {
|
||||
$result[] = $record;
|
||||
}
|
||||
|
||||
// return array
|
||||
return $result;
|
||||
}
|
||||
|
||||
function db_update($query) {
|
||||
// run query
|
||||
$sql = mysql_query($query) or die(mysql_error());
|
||||
}
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
class Db {
|
||||
|
||||
protected $dblink;
|
||||
|
||||
public function __construct ($dblink) {
|
||||
$this->dblink = $dblink;
|
||||
}
|
||||
|
||||
function db_delete($query) {
|
||||
// run query
|
||||
$sql = mysqli_query($this->dblink, $query) or die(mysqli_error($this->dblink));
|
||||
}
|
||||
|
||||
function db_insert($query) {
|
||||
// run query
|
||||
echo "<pre>$query</pre>";
|
||||
$sql = mysqli_query($this->dblink, $query) or die(mysqli_error($this->dblink));
|
||||
|
||||
// return result
|
||||
return mysqli_insert_id($this->dblink);
|
||||
}
|
||||
|
||||
function db_select($query) {
|
||||
// run query
|
||||
$sql = mysqli_query($this->dblink, $query) or die(mysqli_error($this->dblink));
|
||||
|
||||
// loop results
|
||||
$result = array();
|
||||
while($record = mysqli_fetch_assoc($sql)) {
|
||||
$result[] = $record;
|
||||
}
|
||||
|
||||
// return array
|
||||
return $result;
|
||||
}
|
||||
|
||||
function db_update($query) {
|
||||
// run query
|
||||
$sql = mysqli_query($this->dblink, $query) or die(mysqli_error($this->dblink));
|
||||
}
|
||||
|
||||
function options_asset($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT asset_id, asset_name
|
||||
FROM asset
|
||||
ORDER BY asset_name";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['asset_id']] = $rec['asset_name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_assetclass($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT assetclass_id, assetclass_name
|
||||
FROM assetclass
|
||||
ORDER BY assetclass_name";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['assetclass_id']] = $rec['assetclass_name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_assetclassgroup($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT assetclassgroup_id, assetclassgroup_name
|
||||
FROM assetclassgroup
|
||||
ORDER BY assetclassgroup_name";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['assetclassgroup_id']] = $rec['assetclassgroup_name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_location($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT location_id,
|
||||
location_name
|
||||
FROM location
|
||||
ORDER BY location_name";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['location_id']] = $rec['location_name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_subnet($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT subnet_id,
|
||||
CONCAT_WS('/', subnet_address, subnet_mask) AS subnet_name
|
||||
FROM subnet
|
||||
ORDER BY INET_ATON(subnet_address)";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['subnet_id']] = $rec['subnet_name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_vlan($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT vlan_id,
|
||||
CONCAT_WS(' - ', vlan_number, vlan_name) AS vlan_option
|
||||
FROM vlan
|
||||
ORDER BY vlan_number";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['vlan_id']] = $rec['vlan_option'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_zone($null_value=NULL) {
|
||||
$options = array();
|
||||
if (isset($null_value)) {
|
||||
$options[0] = $null_value;
|
||||
}
|
||||
$sql = "SELECT zone_id, zone_origin
|
||||
FROM zone
|
||||
ORDER BY zone_origin";
|
||||
$records = $this->db_select($sql);
|
||||
foreach ($records as $rec) {
|
||||
$options[$rec['zone_id']] = $rec['zone_origin'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -1,94 +1,170 @@
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
// strip mac address to 12 char string
|
||||
function strip_mac($mac) {
|
||||
// strip chars we don't need
|
||||
$mac = preg_replace("|[^a-fA-F0-9]|", "", $mac);
|
||||
|
||||
// capitalize (just because it looks better eh)
|
||||
$mac = strtoupper($mac);
|
||||
|
||||
// and return
|
||||
return ($mac);
|
||||
}
|
||||
|
||||
// rebuild mac address
|
||||
function write_mac($mac) {
|
||||
// check string length
|
||||
if (strlen($mac)!=12) {
|
||||
// if the MAC is empty, or for whatever reason incorrect, just return
|
||||
return $mac;
|
||||
} else {
|
||||
// count to 12...
|
||||
for($i=0;$i<12;$i++) {
|
||||
// ... and strip mac to pieces
|
||||
${"mac".$i} = $mac{$i};
|
||||
}
|
||||
|
||||
// get user preference
|
||||
$user_mac = $_SESSION['suser_mac'];
|
||||
|
||||
// count to 12 again...
|
||||
for($i=0;$i<12;$i++) {
|
||||
// ... and replace user preference with pieces
|
||||
$user_mac = preg_replace("/x/", ${"mac".$i}, $user_mac, 1);
|
||||
}
|
||||
|
||||
// and return
|
||||
return $user_mac;
|
||||
}
|
||||
}
|
||||
|
||||
// redirect page
|
||||
function header_location($location) {
|
||||
// send header
|
||||
header("location: " . $location);
|
||||
|
||||
// exit to be sure
|
||||
exit;
|
||||
}
|
||||
|
||||
// sanitize input
|
||||
function sanitize($input) {
|
||||
// trim whitespaces
|
||||
$input = @trim($input);
|
||||
|
||||
// magic quotes enabled?
|
||||
if(get_magic_quotes_gpc()) {
|
||||
// strip slashes
|
||||
$input = stripslashes($input);
|
||||
}
|
||||
|
||||
// convert to utf-8
|
||||
iconv("UTF-8", "UTF-8", $input);
|
||||
|
||||
// convert special chars
|
||||
$input = htmlentities($input,ENT_QUOTES,'UTF-8');
|
||||
|
||||
// make sql ready
|
||||
$input = mysql_real_escape_string($input);
|
||||
|
||||
// and return
|
||||
return $input;
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
// strip mac address to 12 char string
|
||||
function strip_mac($mac) {
|
||||
// strip chars we don't need
|
||||
$mac = preg_replace("|[^a-fA-F0-9]|", "", $mac);
|
||||
|
||||
// capitalize (just because it looks better eh)
|
||||
$mac = strtoupper($mac);
|
||||
|
||||
// and return
|
||||
return ($mac);
|
||||
}
|
||||
|
||||
// rebuild mac address
|
||||
function write_mac($mac) {
|
||||
// check string length
|
||||
if (strlen($mac)!=12) {
|
||||
// if the MAC is empty, or for whatever reason incorrect, just return
|
||||
return $mac;
|
||||
} else {
|
||||
// count to 12...
|
||||
for($i=0;$i<12;$i++) {
|
||||
// ... and strip mac to pieces
|
||||
${"mac".$i} = $mac{$i};
|
||||
}
|
||||
|
||||
// get user preference
|
||||
$user_mac = $_SESSION['suser_mac'];
|
||||
|
||||
// count to 12 again...
|
||||
for($i=0;$i<12;$i++) {
|
||||
// ... and replace user preference with pieces
|
||||
$user_mac = preg_replace("/x/", ${"mac".$i}, $user_mac, 1);
|
||||
}
|
||||
|
||||
// and return
|
||||
return $user_mac;
|
||||
}
|
||||
}
|
||||
|
||||
// redirect page
|
||||
function header_location($location) {
|
||||
// send header
|
||||
header("location: " . $location);
|
||||
|
||||
// exit to be sure
|
||||
exit;
|
||||
}
|
||||
|
||||
// sanitize input
|
||||
function sanitize($input) {
|
||||
global $dblink;
|
||||
|
||||
// trim whitespaces
|
||||
$input = @trim($input);
|
||||
|
||||
// magic quotes enabled?
|
||||
if(get_magic_quotes_gpc()) {
|
||||
// strip slashes
|
||||
$input = stripslashes($input);
|
||||
}
|
||||
|
||||
// convert to utf-8
|
||||
iconv("UTF-8", "UTF-8", $input);
|
||||
|
||||
// convert special chars
|
||||
$input = htmlentities($input,ENT_QUOTES,'UTF-8');
|
||||
|
||||
// make sql ready
|
||||
$input = mysqli_real_escape_string($dblink, $input);
|
||||
|
||||
// and return
|
||||
return $input;
|
||||
}
|
||||
|
||||
function mysql_nullstring($input) {
|
||||
if (isset($input)) {
|
||||
return $input;
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function lang_getfrombrowser ($allowed_languages, $default_language, $lang_variable = null, $strict_mode = true) {
|
||||
if ($lang_variable === null) {
|
||||
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
|
||||
}
|
||||
if (empty($lang_variable)) {
|
||||
return $default_language;
|
||||
}
|
||||
$accepted_languages = preg_split('/,\s*/', $lang_variable);
|
||||
$current_lang = $default_language;
|
||||
$current_q = 0;
|
||||
foreach ($accepted_languages as $accepted_language) {
|
||||
$res = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i',
|
||||
$accepted_language, $matches);
|
||||
if (!$res) {
|
||||
continue;
|
||||
}
|
||||
$lang_code = explode ('-', $matches[1]);
|
||||
if (isset($matches[2])) {
|
||||
$lang_quality = (float)$matches[2];
|
||||
} else {
|
||||
$lang_quality = 1.0;
|
||||
}
|
||||
while (count ($lang_code)) {
|
||||
if (in_array (strtolower (join ('-', $lang_code)), $allowed_languages)) {
|
||||
if ($lang_quality > $current_q) {
|
||||
$current_lang = strtolower (join ('-', $lang_code));
|
||||
$current_q = $lang_quality;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($strict_mode) {
|
||||
break;
|
||||
}
|
||||
array_pop ($lang_code);
|
||||
}
|
||||
}
|
||||
return $current_lang;
|
||||
}
|
||||
|
||||
function print_tree_rec($tree, $level) {
|
||||
$output = '<ul class="treelvl' . $level. '">' . "\n";
|
||||
foreach ($tree as $node) {
|
||||
$output .= '<li><a href="' . $node['href'] . '">' . $node['value'] . '</a>';
|
||||
if ($node['children']) {
|
||||
$output .= "\n" . print_tree_rec($node['children'], $level+1);
|
||||
}
|
||||
$output .= "</li>\n";
|
||||
}
|
||||
$output .= "</ul>\n";
|
||||
return $output;
|
||||
}
|
||||
|
||||
function print_tree ($params, &$smarty) {
|
||||
if (empty($params['level'])) {
|
||||
$level = 0;
|
||||
} else {
|
||||
$level = $params['level'];
|
||||
}
|
||||
if (empty($params['tree'])) {
|
||||
return '';
|
||||
} else {
|
||||
return print_tree_rec($params['tree'], $level);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
BIN
lib/hs.png
Normal file
BIN
lib/hs.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
BIN
lib/hv.png
Normal file
BIN
lib/hv.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
840
lib/jscolor.js
Normal file
840
lib/jscolor.js
Normal file
@@ -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,115 +1,122 @@
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
class User {
|
||||
function check_strlen($string) {
|
||||
// check length
|
||||
if(strlen($string)<1) {
|
||||
return FALSE;
|
||||
} else {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
function user_login($user_name, $user_pass) {
|
||||
// check user_name length
|
||||
if($this->check_strlen($user_name)==FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// check user_pass length
|
||||
if($this->check_strlen($user_pass)==FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// get user data
|
||||
// initiate class
|
||||
$db = new Db();
|
||||
|
||||
// build query
|
||||
$query = "SELECT
|
||||
user.user_id,
|
||||
user.user_pass,
|
||||
user.user_displayname,
|
||||
user.user_imagesize,
|
||||
user.user_imagecount,
|
||||
user.user_mac,
|
||||
user.user_dateformat,
|
||||
user.user_dns1suffix,
|
||||
user.user_dns2suffix,
|
||||
user.user_menu_assets,
|
||||
user.user_menu_assetclasses,
|
||||
user.user_menu_assetclassgroups,
|
||||
user.user_menu_locations,
|
||||
user.user_menu_nodes,
|
||||
user.user_menu_subnets,
|
||||
user.user_menu_users,
|
||||
user.user_menu_vlans
|
||||
FROM
|
||||
user
|
||||
WHERE
|
||||
user.user_name='" . $user_name . "'";
|
||||
|
||||
// run query
|
||||
$users = $db->db_select($query);
|
||||
|
||||
// count results
|
||||
$user_counter = count($users);
|
||||
|
||||
// any users?
|
||||
if ($user_counter>0) {
|
||||
// compare passwords
|
||||
if(!strcmp(md5($user_pass), $users[0]['user_pass'])) {
|
||||
// all ok: user is logged in, register session data
|
||||
$_SESSION['suser_id'] = $users[0]['user_id'];
|
||||
$_SESSION['suser_displayname'] = $users[0]['user_displayname'];
|
||||
$_SESSION['suser_imagesize'] = $users[0]['user_imagesize'];
|
||||
$_SESSION['suser_imagecount'] = $users[0]['user_imagecount'];
|
||||
$_SESSION['suser_mac'] = $users[0]['user_mac'];
|
||||
$_SESSION['suser_dateformat'] = $users[0]['user_dateformat'];
|
||||
$_SESSION['suser_dns1suffix'] = $users[0]['user_dns1suffix'];
|
||||
$_SESSION['suser_dns2suffix'] = $users[0]['user_dns2suffix'];
|
||||
$_SESSION['suser_menu_assets'] = $users[0]['user_menu_assets'];
|
||||
$_SESSION['suser_menu_assetclasses'] = $users[0]['user_menu_assetclasses'];
|
||||
$_SESSION['suser_menu_assetclassgroups'] = $users[0]['user_menu_assetclassgroups'];
|
||||
$_SESSION['suser_menu_locations'] = $users[0]['user_menu_locations'];
|
||||
$_SESSION['suser_menu_nodes'] = $users[0]['user_menu_nodes'];
|
||||
$_SESSION['suser_menu_subnets'] = $users[0]['user_menu_subnets'];
|
||||
$_SESSION['suser_menu_users'] = $users[0]['user_menu_users'];
|
||||
$_SESSION['suser_menu_vlans'] = $users[0]['user_menu_vlans'];
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// no errors found, return
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function user_logout() {
|
||||
// clear and destroy session
|
||||
$_SESSION = array();
|
||||
}
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
/*****************************************************************************
|
||||
IP Reg, a PHP/MySQL IPAM tool
|
||||
Copyright (C) 2007-2009 Wietse Warendorff
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
For more information, visit http://sourceforge.net/projects/ipreg,
|
||||
or contact me at wietsew@users.sourceforge.net
|
||||
*****************************************************************************/
|
||||
|
||||
class User {
|
||||
function check_strlen($string) {
|
||||
// check length
|
||||
if(strlen($string)<1) {
|
||||
return FALSE;
|
||||
} else {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
function user_login($user_name, $user_pass) {
|
||||
global $dblink;
|
||||
// check user_name length
|
||||
if($this->check_strlen($user_name)==FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// check user_pass length
|
||||
if($this->check_strlen($user_pass)==FALSE) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// get user data
|
||||
// initiate class
|
||||
$db = new Db($dblink);
|
||||
|
||||
// build query
|
||||
$query = "SELECT
|
||||
user.user_id,
|
||||
user.user_pass,
|
||||
user.user_displayname,
|
||||
user.user_language,
|
||||
user.user_imagesize,
|
||||
user.user_imagecount,
|
||||
user.user_mac,
|
||||
user.user_dateformat,
|
||||
user.user_dns1suffix,
|
||||
user.user_dns2suffix,
|
||||
user.user_menu_assets,
|
||||
user.user_menu_assetclasses,
|
||||
user.user_menu_assetclassgroups,
|
||||
user.user_menu_locations,
|
||||
user.user_menu_nodes,
|
||||
user.user_menu_subnets,
|
||||
user.user_menu_users,
|
||||
user.user_menu_vlans,
|
||||
user.user_menu_zones,
|
||||
user.user_tooltips
|
||||
FROM
|
||||
user
|
||||
WHERE
|
||||
user.user_name='" . $user_name . "'";
|
||||
|
||||
// run query
|
||||
$users = $db->db_select($query);
|
||||
|
||||
// count results
|
||||
$user_counter = count($users);
|
||||
|
||||
// any users?
|
||||
if ($user_counter>0) {
|
||||
// compare passwords
|
||||
if(!strcmp(md5($user_pass), $users[0]['user_pass'])) {
|
||||
// all ok: user is logged in, register session data
|
||||
$_SESSION['suser_id'] = $users[0]['user_id'];
|
||||
$_SESSION['suser_displayname'] = $users[0]['user_displayname'];
|
||||
$_SESSION['suser_language'] = $users[0]['user_language'];
|
||||
$_SESSION['suser_imagesize'] = $users[0]['user_imagesize'];
|
||||
$_SESSION['suser_imagecount'] = $users[0]['user_imagecount'];
|
||||
$_SESSION['suser_mac'] = $users[0]['user_mac'];
|
||||
$_SESSION['suser_dateformat'] = $users[0]['user_dateformat'];
|
||||
$_SESSION['suser_dns1suffix'] = $users[0]['user_dns1suffix'];
|
||||
$_SESSION['suser_dns2suffix'] = $users[0]['user_dns2suffix'];
|
||||
$_SESSION['suser_menu_assets'] = $users[0]['user_menu_assets'];
|
||||
$_SESSION['suser_menu_assetclasses'] = $users[0]['user_menu_assetclasses'];
|
||||
$_SESSION['suser_menu_assetclassgroups'] = $users[0]['user_menu_assetclassgroups'];
|
||||
$_SESSION['suser_menu_locations'] = $users[0]['user_menu_locations'];
|
||||
$_SESSION['suser_menu_nodes'] = $users[0]['user_menu_nodes'];
|
||||
$_SESSION['suser_menu_subnets'] = $users[0]['user_menu_subnets'];
|
||||
$_SESSION['suser_menu_users'] = $users[0]['user_menu_users'];
|
||||
$_SESSION['suser_menu_vlans'] = $users[0]['user_menu_vlans'];
|
||||
$_SESSION['suser_menu_zones'] = $users[0]['user_menu_zones'];
|
||||
$_SESSION['suser_tooltips'] = $users[0]['user_tooltips'];
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// no errors found, return
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function user_logout() {
|
||||
// clear and destroy session
|
||||
$_SESSION = array();
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
483
lib/yapter.php
483
lib/yapter.php
@@ -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 <20>
|
||||
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";
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user