first commit
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					.DS_Store
 | 
				
			||||||
 | 
					.svn
 | 
				
			||||||
							
								
								
									
										5
									
								
								config.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								config.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					name: engine
 | 
				
			||||||
 | 
					version: 1
 | 
				
			||||||
 | 
					handle:
 | 
				
			||||||
 | 
						- rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}"
 | 
				
			||||||
							
								
								
									
										4
									
								
								config/app.config.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								config/app.config.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					$__config['akey'] ='';// appkey
 | 
				
			||||||
 | 
					$__config['skey'] = '';// secret key
 | 
				
			||||||
 | 
					$__config['callback'] = 'http://'.$_SERVER['HTTP_HOST'].'/?c=callback';
 | 
				
			||||||
							
								
								
									
										15
									
								
								config/db.config.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								config/db.config.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					// main db setting
 | 
				
			||||||
 | 
					$master['host'] = 'localhost';
 | 
				
			||||||
 | 
					$master['user'] = 'root';
 | 
				
			||||||
 | 
					$master['passwd'] = '';
 | 
				
			||||||
 | 
					$master['dbname'] = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* slave db seting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$slave['host'] = 'localhost';
 | 
				
			||||||
 | 
					$slave['user'] = 'root';
 | 
				
			||||||
 | 
					$slave['passwd'] = '';
 | 
				
			||||||
 | 
					$slave['dbname'] = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
							
								
								
									
										39
									
								
								controllers/callback.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								controllers/callback.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class callback extends BaseController {
 | 
				
			||||||
 | 
						public function enter(){
 | 
				
			||||||
 | 
							if( v('code') && !$_SESSION['__SINA']['TOKEN'] ){
 | 
				
			||||||
 | 
								$keys = array();
 | 
				
			||||||
 | 
								$keys['code'] = v('code');
 | 
				
			||||||
 | 
								$keys['redirect_uri'] = c('callback');
 | 
				
			||||||
 | 
								if( $token = Weibo::getAccessToken( 'code',$keys ) ){
 | 
				
			||||||
 | 
									$res = Weibo::show_user_by_id( $token['uid'] );
 | 
				
			||||||
 | 
									if( $res && !isset( $res['error_code'] ) ){
 | 
				
			||||||
 | 
										foreach ($res as $key => $value) {
 | 
				
			||||||
 | 
											$_SESSION[$key] = $value;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										$_SESSION['__SINA']['TOKEN'] = $token;
 | 
				
			||||||
 | 
									}else{
 | 
				
			||||||
 | 
										die( 'REST API ERROR!' );
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									$_SESSION['expiresTime'] = time() +  $token['remind_in'];
 | 
				
			||||||
 | 
									$_SESSION['__SINA']['TOKEN'] = $token['access_token'];
 | 
				
			||||||
 | 
									$_SESSION['uid'] = $token['uid'] ;
 | 
				
			||||||
 | 
									$uid=$_SESSION['uid'];
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									if( $_SESSION['backUrl'] ){
 | 
				
			||||||
 | 
										if( strpos( $_SESSION['backUrl'] , '?' ) === false ){
 | 
				
			||||||
 | 
											$backUrl = $_SESSION['backUrl'].'?viewer='.$_SESSION['uid'];
 | 
				
			||||||
 | 
										}else{
 | 
				
			||||||
 | 
											$backUrl = $_SESSION['backUrl'].'&viewer='.$_SESSION['uid'];
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										header("Location: ".$backUrl );
 | 
				
			||||||
 | 
									}else{
 | 
				
			||||||
 | 
										header('Location: http://'.$_SERVER['HTTP_HOST'].'/');
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								die( '<div style="padding:20px;text-aligin:center">只有授权后才能进入应用 </div>' );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								controllers/main.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								controllers/main.class.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Main extends BaseController{
 | 
				
			||||||
 | 
						public function enter(){
 | 
				
			||||||
 | 
							echo '<br/><br/><br/><br/>';
 | 
				
			||||||
 | 
							echo 'isAjax:'.isAjax();
 | 
				
			||||||
 | 
							echo Url::getMethod();
 | 
				
			||||||
 | 
							echo Url::$url;
 | 
				
			||||||
 | 
							$this->render();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function test(){
 | 
				
			||||||
 | 
							print_r( $_REQUEST );
 | 
				
			||||||
 | 
							echo 'isAjax:'.isAjax();
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								engine/Autoloader.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								engine/Autoloader.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Autoloader {
 | 
				
			||||||
 | 
						private static $autoloaderData = array();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static function addLoadPath( $dir ) {
 | 
				
			||||||
 | 
							array_unshift( self::$autoloaderData, $dir);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function getPathByClassName($className) {
 | 
				
			||||||
 | 
							$className = str_replace( array('/','\\') , array('','') ,  $className );
 | 
				
			||||||
 | 
							$file = NULL;
 | 
				
			||||||
 | 
							if( self::$autoloaderData ){
 | 
				
			||||||
 | 
								foreach (self::$autoloaderData as $path  ) {
 | 
				
			||||||
 | 
									if( is_file( $path.'/'.$className.'.class.php' ) ){
 | 
				
			||||||
 | 
										return $path.'/'.$className.'.class.php';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function engine_autoload($class_name) {
 | 
				
			||||||
 | 
						$path = Autoloader::getPathByClassName($class_name);
 | 
				
			||||||
 | 
						if( $path ){
 | 
				
			||||||
 | 
							require($path);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					spl_autoload_register("engine_autoload");
 | 
				
			||||||
							
								
								
									
										9
									
								
								engine/config/core.config.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								engine/config/core.config.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					$__config['version'] = '1.0';
 | 
				
			||||||
 | 
					$__config['default_method'] = 'enter';
 | 
				
			||||||
 | 
					$__config['default_class'] = 'main';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$__config['cdn'] = false; 
 | 
				
			||||||
 | 
					//url and db
 | 
				
			||||||
 | 
					$__config['static_url'] = 1; 
 | 
				
			||||||
 | 
					$__config['use_rdc'] = 1; 
 | 
				
			||||||
							
								
								
									
										19
									
								
								engine/init.inc.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								engine/init.inc.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * this file is init the framework
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					if( !defined('IN') ) die('bad request');
 | 
				
			||||||
 | 
					define( 'ENGINE' , dirname( __FILE__ ) . '/' );
 | 
				
			||||||
 | 
					define( 'ISSAE', isset( $_SERVER['HTTP_APPNAME'] )&&$_SERVER['HTTP_APPNAME']?true:false );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include_once(ENGINE."Autoloader.class.php");
 | 
				
			||||||
 | 
					include_once(ENGINE."lib/core.function.php");
 | 
				
			||||||
 | 
					include_once(ROOT."lib/app.function.php");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Autoloader::addLoadPath( ENGINE. 'lib' );
 | 
				
			||||||
 | 
					Autoloader::addLoadPath( ROOT. 'lib');
 | 
				
			||||||
 | 
					if( c('static_url') )
 | 
				
			||||||
 | 
						Url::initParams();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if( c('cdn') )
 | 
				
			||||||
 | 
						Cdn::init( c('cdn') );
 | 
				
			||||||
							
								
								
									
										38
									
								
								engine/lib/Cache.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										38
									
								
								engine/lib/Cache.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					Class Cache{
 | 
				
			||||||
 | 
						const CACHEDB = 'SaeMemcache';
 | 
				
			||||||
 | 
						private static $mmc = false;
 | 
				
			||||||
 | 
						private static $cacheGet = array();
 | 
				
			||||||
 | 
						private static function  init(){
 | 
				
			||||||
 | 
							if( self::$mmc === false ){
 | 
				
			||||||
 | 
								self::$mmc = memcache_init();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function get($key){
 | 
				
			||||||
 | 
							if( !self::$cacheGet[$key] ){
 | 
				
			||||||
 | 
								self::init();
 | 
				
			||||||
 | 
								if( self::$mmc === false ){
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								self::$cacheGet[$key] = memcache_get(self::$mmc,$key);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return self::$cacheGet[$key];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function set( $key , $value , $time = 18000 ){
 | 
				
			||||||
 | 
							if( !self::$cacheGet[$key]  ){
 | 
				
			||||||
 | 
								self::$cacheGet[$key] = $value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							self::init();
 | 
				
			||||||
 | 
							if( self::$mmc === false ){
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							memcache_set( self::$mmc , $key ,$value , false , $time );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function increment( $key , $value = 1 ){
 | 
				
			||||||
 | 
							if( !self::$cacheGet[$key]  ){
 | 
				
			||||||
 | 
								self::$cacheGet[$key] += $value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							self::init();
 | 
				
			||||||
 | 
							return memcache_increment(  self::$mmc , $key ,$value );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								engine/lib/Cdn.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								engine/lib/Cdn.class.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Cdn{
 | 
				
			||||||
 | 
						public static $cdnHost = false;
 | 
				
			||||||
 | 
						public static function init( $cdnHost ){
 | 
				
			||||||
 | 
							self::$cdnHost = $cdnHost;
 | 
				
			||||||
 | 
							ob_start();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function flush(){
 | 
				
			||||||
 | 
							$html  = ob_get_clean();
 | 
				
			||||||
 | 
							$regs['linkReg']['reg'] = '/<link\s*([^\r\n]+?)href=[\'\"](?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]/is';
 | 
				
			||||||
 | 
							$regs['linkReg']['replace'] = '<link ${1}href="http://'.self::$cdnHost.'/$2"';
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$regs['scriptReg']['reg'] = '/<script\s*([^\r\n]+?)src=[\'\"](?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]/is';
 | 
				
			||||||
 | 
							$regs['scriptReg']['replace'] = '<script $1src="http://'.self::$cdnHost.'/$2"';
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$regs['imgReg1']['reg'] = '/<img([^\r\n]+?)src=\'(?!http:\/\/|https:\/\/)\/?(.+?)\'/is';
 | 
				
			||||||
 | 
							$regs['imgReg1']['replace'] = '<img${1}src=\'http://'.self::$cdnHost.'/$2\'';
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$regs['imgReg2']['reg'] = '/<img([^\r\n]+?)src="(?!http:\/\/|https:\/\/)\/?(.+?)"/is';
 | 
				
			||||||
 | 
							$regs['imgReg2']['replace'] = '<img${1}src="http://'.self::$cdnHost.'/$2"';
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$regs['bgReg']['reg'] = '/background-image:(\s*?)url\([\'\"]?(?!http:\/\/|https:\/\/)\/?(.+?)[\'\"]?\)/is';
 | 
				
			||||||
 | 
							$regs['bgReg']['replace'] = 'background-image:url( http://'.self::$cdnHost.'/$2 )';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$regs['aReg1']['reg'] = '/<a[\s\r\n]*([^\r\n]*?)href=\'(?!http:\/\/|https:\/\/)\/?([^\r\n]+?)(\.jpg\'|\.png\'|\.gif\')/is';
 | 
				
			||||||
 | 
							$regs['aReg1']['replace'] = '<a $1href=\'http://'.self::$cdnHost.'/$2';
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$regs['aReg2']['reg'] = '/<a[\s\r\n]*([^\r\n]*?)href="(?!http:\/\/|https:\/\/)\/?([^\r\n]+?)(\.jpg"|\.png"|\.gif")/is';
 | 
				
			||||||
 | 
							$regs['aReg2']['replace'] = '<a $1href="http://'.self::$cdnHost.'/$2$3';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							foreach ($regs as $key => $value) {
 | 
				
			||||||
 | 
								$html =  preg_replace($value['reg'], $value['replace'], $html);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							echo $html;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function cdnFlush(){
 | 
				
			||||||
 | 
						Cdn::flush();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					register_shutdown_function( 'cdnFlush' );
 | 
				
			||||||
							
								
								
									
										444
									
								
								engine/lib/Db.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										444
									
								
								engine/lib/Db.class.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,444 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Db{
 | 
				
			||||||
 | 
						public	$ar_sql				= NULL;
 | 
				
			||||||
 | 
						private $ar_select			= array();
 | 
				
			||||||
 | 
						private $ar_from			= array();
 | 
				
			||||||
 | 
						private $ar_where			= array();
 | 
				
			||||||
 | 
						private $ar_like			= array();
 | 
				
			||||||
 | 
						private $ar_set				= array();
 | 
				
			||||||
 | 
						private $ar_offset			= FALSE;
 | 
				
			||||||
 | 
						//private $ar_groupby			= array();
 | 
				
			||||||
 | 
						private $ar_limit			= FALSE;
 | 
				
			||||||
 | 
						private $ar_orderby			= array();
 | 
				
			||||||
 | 
						private $mysql				= false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public function __construct(){
 | 
				
			||||||
 | 
							if( defined( 'ISSAE' ) && ISSAE  ){
 | 
				
			||||||
 | 
								$master['host'] = SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT;
 | 
				
			||||||
 | 
								$master['user'] = SAE_MYSQL_USER;
 | 
				
			||||||
 | 
								$master['passwd'] =SAE_MYSQL_PASS;
 | 
				
			||||||
 | 
								$master['dbname'] = SAE_MYSQL_DB;
 | 
				
			||||||
 | 
								$slave['host'] = SAE_MYSQL_HOST_S.':'.SAE_MYSQL_PORT;
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								include_once( ROOT.'config/db.config.php' );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$this->mysql = new Mysql( $master );
 | 
				
			||||||
 | 
							if( isset( $slave ) && $slave ){
 | 
				
			||||||
 | 
								$this->mysql->setSlave( $slave );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function __set( $key , $value ){
 | 
				
			||||||
 | 
							if( $key == 'do_replication' ){
 | 
				
			||||||
 | 
								$this->mysql->$key = $value;
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function __get( $key ){
 | 
				
			||||||
 | 
							if( $key == 'sql' ){
 | 
				
			||||||
 | 
								return $this->getSql();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function escape( $str ){
 | 
				
			||||||
 | 
							return $this->mysql->escape( $str );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function getSql(){
 | 
				
			||||||
 | 
							if( $this->ar_from ){
 | 
				
			||||||
 | 
								$this->ar_sql = $this->_compile_select();
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if( $this->ar_sql ){
 | 
				
			||||||
 | 
								return $this->ar_sql;
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								die('can not make sql...');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function getData( $sql = NULL , $key = NULL ){
 | 
				
			||||||
 | 
							if( $sql == NULL ){
 | 
				
			||||||
 | 
								$sql = $this->getSql();
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
								$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this->mysql->getData($sql , $key );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function getLine( $sql = NULL ){
 | 
				
			||||||
 | 
							if( $sql == NULL ){
 | 
				
			||||||
 | 
								$sql = $this->getSql();
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
								$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this->mysql->getLine($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function getVar( $sql = NULL ){
 | 
				
			||||||
 | 
							if( $sql == NULL ){
 | 
				
			||||||
 | 
								$sql = $this->getSql();
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
								$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this->mysql->getVar($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function runSql( $sql = NULL ){
 | 
				
			||||||
 | 
							if( $sql == NULL ){
 | 
				
			||||||
 | 
								$sql = $this->getSql();
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
								$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this->mysql->runSql($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function lastId(){
 | 
				
			||||||
 | 
							return $this->mysql->lastId();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function error(){
 | 
				
			||||||
 | 
							return $this->mysql->error();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE){
 | 
				
			||||||
 | 
							if ($table == ''){
 | 
				
			||||||
 | 
								if ( ! isset($this->ar_from[0])){
 | 
				
			||||||
 | 
									die('can not delete error no params...');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$table = $this->ar_from[0];
 | 
				
			||||||
 | 
							}elseif (is_array($table)){
 | 
				
			||||||
 | 
								foreach ($table as $single_table){
 | 
				
			||||||
 | 
									$this->delete($single_table, $where, $limit, FALSE);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($where != ''){
 | 
				
			||||||
 | 
								$this->where($where);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($limit != NULL){
 | 
				
			||||||
 | 
								$this->limit($limit);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (count($this->ar_where) == 0 && count($this->ar_like) == 0){
 | 
				
			||||||
 | 
								die('db_del_must_use_where...');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ($reset_data){
 | 
				
			||||||
 | 
								$this->ar_sql = $sql;
 | 
				
			||||||
 | 
								$this->_resetCache();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this->runSql($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function replace($table = '', $set = NULL){
 | 
				
			||||||
 | 
							if ( ! is_null($set)){
 | 
				
			||||||
 | 
								$this->set($set);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (count($this->ar_set) == 0){
 | 
				
			||||||
 | 
								die('can not replace error no params...');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($table == ''){
 | 
				
			||||||
 | 
								if ( ! isset($this->ar_from[0])){
 | 
				
			||||||
 | 
										die('can not replace error no table to use...');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$table = $this->ar_from[0];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$sql = $this->_replace($table, array_keys($this->ar_set), array_values($this->ar_set));
 | 
				
			||||||
 | 
							$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							$this->_resetCache();
 | 
				
			||||||
 | 
							return $this->runSql($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function update($table = '', $set = NULL, $where = NULL, $limit = NULL , $escape = true ){
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							if ( ! is_null($set)){
 | 
				
			||||||
 | 
								$this->set($set);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (count($this->ar_set) == 0){
 | 
				
			||||||
 | 
								die('can not update error no params...');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ($table == ''){
 | 
				
			||||||
 | 
								if ( ! isset($this->ar_from[0])){
 | 
				
			||||||
 | 
									die('can not update error no table to use...');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$table = $this->ar_from[0];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($where != NULL){
 | 
				
			||||||
 | 
								$this->where($where);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ($limit != NULL){
 | 
				
			||||||
 | 
								$this->limit($limit);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ( $escape && !preg_match("/(`)/i", trim($table))){
 | 
				
			||||||
 | 
								$table = '`'.trim($table).'`';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$sql = $this->_update($table, $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit);
 | 
				
			||||||
 | 
							$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							$this->_resetCache();
 | 
				
			||||||
 | 
							return $this->runSql($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function insert($table = '', $set = NULL){
 | 
				
			||||||
 | 
							if ( ! is_null($set)){
 | 
				
			||||||
 | 
								$this->set($set);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (count($this->ar_set) == 0){
 | 
				
			||||||
 | 
								die('can not insert error no params...');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($table == ''){
 | 
				
			||||||
 | 
								if ( ! isset($this->ar_from[0])){
 | 
				
			||||||
 | 
									die('can not insert error no table to use...');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$table = $this->ar_from[0];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$sql = $this->_insert($table, array_keys($this->ar_set), array_values($this->ar_set));
 | 
				
			||||||
 | 
							$this->ar_sql = $sql;
 | 
				
			||||||
 | 
							$this->_resetCache();
 | 
				
			||||||
 | 
							return $this->runSql($sql);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function select($select = '*'){
 | 
				
			||||||
 | 
							if (is_string($select)){
 | 
				
			||||||
 | 
								$select = explode(',', $select);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							foreach ($select as $val){
 | 
				
			||||||
 | 
								$val = trim($val);
 | 
				
			||||||
 | 
								if ($val != ''){
 | 
				
			||||||
 | 
									$this->ar_select[] = $val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function from($from , $escape = true ){
 | 
				
			||||||
 | 
							foreach ((array)$from as $val){
 | 
				
			||||||
 | 
								if (strpos($val, ',') !== FALSE){
 | 
				
			||||||
 | 
									foreach (explode(',', $val) as $v){
 | 
				
			||||||
 | 
										$v = trim($v);
 | 
				
			||||||
 | 
										if ($escape && !preg_match("/(`)/i", $v )){
 | 
				
			||||||
 | 
											$v  = '`'.trim($v).'`';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										$this->ar_from[] = $v;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									$val = trim($val);
 | 
				
			||||||
 | 
									if ($escape && !preg_match("/(`)/i", $val )){
 | 
				
			||||||
 | 
										$val  = '`'.trim($val).'`';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									$this->ar_from[] = $val;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						function like($field, $match = ''){
 | 
				
			||||||
 | 
							return $this->_like($field, $match, 'AND ');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						function notLike($field, $match = '', $side = 'both'){
 | 
				
			||||||
 | 
							return $this->_like($field, $match, 'AND ', 'NOT');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						function orLike($field, $match = ''){
 | 
				
			||||||
 | 
							return $this->_like($field, $match, 'OR ');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						function orNotLike($field, $match = ''){
 | 
				
			||||||
 | 
							return $this->_like($field, $match, 'OR ', 'NOT');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function where($key, $value = NULL){
 | 
				
			||||||
 | 
							return $this->_where($key, $value, 'AND ');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function orWhere($key, $value = NULL, $escape = TRUE){
 | 
				
			||||||
 | 
							return $this->_where($key, $value, 'OR ', $escape);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function orderBy($orderby, $direction = '' , $escape = true  ){
 | 
				
			||||||
 | 
							if (trim($direction) != ''){
 | 
				
			||||||
 | 
								$direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ( $escape && strpos($orderby, ',') !== FALSE){
 | 
				
			||||||
 | 
								$temp = array();
 | 
				
			||||||
 | 
								foreach (explode(',', $orderby) as $part)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									$part = trim($part);
 | 
				
			||||||
 | 
									$temp[] = '`'.$part.'`';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$orderby = implode(', ', $temp);
 | 
				
			||||||
 | 
							}elseif($escape == true ){
 | 
				
			||||||
 | 
								$orderby ='`'.$orderby.'`';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$orderby_statement = $orderby.$direction;
 | 
				
			||||||
 | 
							$this->ar_orderby[] = $orderby_statement;
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function limit($value , $offset = NULL){
 | 
				
			||||||
 | 
							$this->ar_limit = $value;
 | 
				
			||||||
 | 
							if ($offset != ''){
 | 
				
			||||||
 | 
								$this->ar_offset = $offset;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public function set($key, $value = NULL ,  $escape = true ){
 | 
				
			||||||
 | 
							if ( ! is_array($key)){
 | 
				
			||||||
 | 
								if(is_null($value) && $this->_has_operator($key) ){
 | 
				
			||||||
 | 
									$key = array( $key );
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									$key = array($key => $value);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							foreach ($key as $k => $v){
 | 
				
			||||||
 | 
								if( is_numeric($k) && strpos( $v , '=' ) !== false ){
 | 
				
			||||||
 | 
									list( $k , $v ) = explode(  '=' , $v  , 2 );
 | 
				
			||||||
 | 
									$k = trim($k);
 | 
				
			||||||
 | 
									$v = trim($v);
 | 
				
			||||||
 | 
									if( $escape ){
 | 
				
			||||||
 | 
										if ( !preg_match("/(`)/i", trim($k))){
 | 
				
			||||||
 | 
											$k = '`'.trim($k).'`';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if ( !preg_match("/(\-|\+)/i", $v)){
 | 
				
			||||||
 | 
											$v = '`'.trim($v).'`';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									if ( $escape ){
 | 
				
			||||||
 | 
										$k = '`'.$k.'`';
 | 
				
			||||||
 | 
										$v = "'".$this->escape($v)."'";
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								$this->ar_set[$k] = $v;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _resetCache(){
 | 
				
			||||||
 | 
							$this->ar_select = array();
 | 
				
			||||||
 | 
							$this->ar_from = array();
 | 
				
			||||||
 | 
							$this->ar_where = array();
 | 
				
			||||||
 | 
							$this->ar_like = array();
 | 
				
			||||||
 | 
							$this->ar_offset = FALSE;
 | 
				
			||||||
 | 
							$this->ar_limit = FALSE;
 | 
				
			||||||
 | 
							$this->ar_orderby = array();
 | 
				
			||||||
 | 
							$this->ar_set = array();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _like($field, $match = '', $type = 'AND ', $not = ''){
 | 
				
			||||||
 | 
							if ( ! is_array($field)){
 | 
				
			||||||
 | 
								$field = array($field => $match);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							foreach ($field as $k => $v){
 | 
				
			||||||
 | 
								$prefix = (count($this->ar_like) == 0) ? '' : $type;
 | 
				
			||||||
 | 
								$v = $this->escape($v);
 | 
				
			||||||
 | 
								$like_statement = $prefix." `$k` $not LIKE '%{$v}%'";
 | 
				
			||||||
 | 
								$this->ar_like[] = $like_statement;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _where($key, $value = NULL, $type = 'AND ', $escape = NULL){
 | 
				
			||||||
 | 
							if ( ! is_array($key)){
 | 
				
			||||||
 | 
								$key = array($key => $value);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If the escape value was not set will will base it on the global setting
 | 
				
			||||||
 | 
							if ( ! is_bool($escape)){
 | 
				
			||||||
 | 
								//$escape = $this->_protect_identifiers;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							foreach ($key as $k => $v){
 | 
				
			||||||
 | 
								$prefix = (count($this->ar_where) == 0 ) ? '' : $type;
 | 
				
			||||||
 | 
								if( !is_numeric($k) ){
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
									if (is_null($v) && ! $this->_has_operator($k)){
 | 
				
			||||||
 | 
										// value appears not to have been set, assign the test to IS NULL
 | 
				
			||||||
 | 
										$k = '`'.$k.'`'.' IS NULL';
 | 
				
			||||||
 | 
										//$v = "'".$this->escape($v)."'";
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
									if ( ! is_null($v)){
 | 
				
			||||||
 | 
										if ( ! $this->_has_operator($k)){
 | 
				
			||||||
 | 
											$k = '`'.$k.'` =';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										$v = "'".$this->escape($v)."'";
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									$k = NULL;
 | 
				
			||||||
 | 
								}	
 | 
				
			||||||
 | 
								$this->ar_where[] = $prefix.$k.$v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $this;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _has_operator($str){
 | 
				
			||||||
 | 
							$str = trim($str);
 | 
				
			||||||
 | 
							if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)){
 | 
				
			||||||
 | 
								return FALSE;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return TRUE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _compile_select(){
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
							$sql =  'SELECT ' ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (count($this->ar_select) == 0){
 | 
				
			||||||
 | 
								$sql .= '*';
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$sql .= implode(', ', $this->ar_select);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (count($this->ar_from) > 0){
 | 
				
			||||||
 | 
								$sql .= "\nFROM ";
 | 
				
			||||||
 | 
								$sql .= implode("\n", $this->ar_from);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (count($this->ar_where) > 0 OR count($this->ar_like) > 0){
 | 
				
			||||||
 | 
								$sql .= "\n";
 | 
				
			||||||
 | 
								$sql .= "WHERE ";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$sql .= implode("\n", $this->ar_where);
 | 
				
			||||||
 | 
							if (count($this->ar_like) > 0){
 | 
				
			||||||
 | 
								if (count($this->ar_where) > 0){
 | 
				
			||||||
 | 
									$sql .= "\nAND ";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$sql .= implode("\n", $this->ar_like);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (count($this->ar_orderby) > 0){
 | 
				
			||||||
 | 
								$sql .= "\nORDER BY ";
 | 
				
			||||||
 | 
								$sql .= implode(', ', $this->ar_orderby);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (is_numeric($this->ar_limit)){
 | 
				
			||||||
 | 
								$sql .= "\nLIMIT ";
 | 
				
			||||||
 | 
								$sql .= $this->ar_limit;
 | 
				
			||||||
 | 
								if( intval( $this->ar_offset ) ){
 | 
				
			||||||
 | 
									$sql .= ','.intval( $this->ar_offset );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $sql;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _insert($table , $keys , $values ){
 | 
				
			||||||
 | 
							$sql = "INSERT INTO $table (".join(',',$keys).")VALUES(".join(",",$values).")";
 | 
				
			||||||
 | 
							return $sql;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _update($table, $values, $where, $orderby = array(), $limit = FALSE){
 | 
				
			||||||
 | 
							foreach ($values as $key => $val){
 | 
				
			||||||
 | 
								$valstr[] = $key . ' = ' . $val;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
 | 
				
			||||||
 | 
							$orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
 | 
				
			||||||
 | 
							$sql = "UPDATE ".$table." SET ".implode(', ', $valstr);
 | 
				
			||||||
 | 
							$sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
 | 
				
			||||||
 | 
							$sql .= $orderby.$limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return $sql;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _replace($table, $keys, $values){
 | 
				
			||||||
 | 
							return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private function _delete($table, $where = array(), $like = array(), $limit = FALSE){
 | 
				
			||||||
 | 
							$conditions = '';
 | 
				
			||||||
 | 
							if (count($where) > 0 OR count($like) > 0){
 | 
				
			||||||
 | 
								$conditions = "\nWHERE ";
 | 
				
			||||||
 | 
								$conditions .= implode("\n", $where);
 | 
				
			||||||
 | 
								if (count($like) > 0){
 | 
				
			||||||
 | 
									$conditions .= " AND ";
 | 
				
			||||||
 | 
									$conditions .= implode("\n", $like);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return "DELETE FROM ".$table.$conditions.$limit;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								engine/lib/IFCookie.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								engine/lib/IFCookie.class.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class IFCookie{
 | 
				
			||||||
 | 
						const	SESSIONSTR = 'SID';
 | 
				
			||||||
 | 
						public static function isNeedFix(){
 | 
				
			||||||
 | 
							$agent = $_SERVER['HTTP_USER_AGENT'];
 | 
				
			||||||
 | 
							if( strpos($agent,"iPhone") || strpos($agent,"Safari")  ){
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function fix(){
 | 
				
			||||||
 | 
							$pre = $_REQUEST[Url::SHORT_CLASS_TAG] == 'callback'?'state':self::SESSIONSTR;
 | 
				
			||||||
 | 
							if( isset( $_REQUEST[$pre] ) && $_REQUEST[$pre] && self::isNeedFix() ){
 | 
				
			||||||
 | 
								$sid = $_REQUEST[$pre];
 | 
				
			||||||
 | 
								session_id( $sid );
 | 
				
			||||||
 | 
								Url::$custom[self::SESSIONSTR] = $sid;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										117
									
								
								engine/lib/Icon.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										117
									
								
								engine/lib/Icon.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Icon{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function createIcon(){
 | 
				
			||||||
 | 
							$this->getImgSize();
 | 
				
			||||||
 | 
							//print_r( $this->img_info );
 | 
				
			||||||
 | 
							if( !$this->img_info ) return false;
 | 
				
			||||||
 | 
							$this->getNewSize();
 | 
				
			||||||
 | 
							$this->makeIcon();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						function getImgSize(){
 | 
				
			||||||
 | 
							$this->img_info = @getImagesize( $this->path );
 | 
				
			||||||
 | 
							$this->w = $this->img_info[0];
 | 
				
			||||||
 | 
							$this->h = $this->img_info[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch ( $this->img_info[2] ){
 | 
				
			||||||
 | 
								case 1:
 | 
				
			||||||
 | 
									$this->t = 'gif';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									$this->t = 'jpg';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 3:
 | 
				
			||||||
 | 
									$this->t = 'png';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function getNewSize(){
 | 
				
			||||||
 | 
							if( $this->w > $this->h ){
 | 
				
			||||||
 | 
								$this->nh = $this->size;
 | 
				
			||||||
 | 
								$this->nw = ($this->size/$this->h) * $this->w;
 | 
				
			||||||
 | 
								$this->type = 1;
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->nw = $this->size;
 | 
				
			||||||
 | 
								$this->nh = ($this->size/$this->w) * $this->h;
 | 
				
			||||||
 | 
								$this->type = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function makeIcon(){
 | 
				
			||||||
 | 
								$type = $this->type;
 | 
				
			||||||
 | 
								//$img_des = ImageCreateTrueColor ( $this->size, $this->size );
 | 
				
			||||||
 | 
								$img_des = ImageCreateTrueColor ( $this->size , $this->size );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$background = imagecolorallocate( $img_des , 255 , 255 , 255 );
 | 
				
			||||||
 | 
								imagefill( $img_des , 0 , 0 , $background ); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch ( $this->t ){
 | 
				
			||||||
 | 
									case 'gif':
 | 
				
			||||||
 | 
										$img_src = ImageCreateFromGIF ( $this->path );
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 'jpg':
 | 
				
			||||||
 | 
										$img_src = ImageCreateFromJPEG ( $this->path );
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 'png':
 | 
				
			||||||
 | 
										$img_src = ImageCreateFromPNG ( $this->path );
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if( $type === 1 ){
 | 
				
			||||||
 | 
									imagecopyresampled( $img_des, $img_src, 0, 0, ($this->w-$this->h)/2 , 0, $this->nw , $this->nh, $this->w, $this->h );
 | 
				
			||||||
 | 
								}elseif( $type === 0 ){
 | 
				
			||||||
 | 
									imagecopyresampled( $img_des, $img_src, 0, 0, 0 , ($this->h-$this->w)/2, $this->nw , $this->nh, $this->w, $this->h );
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									imagecopyresampled( $img_des, $img_src, 0, 0, 0 , 0 , $this->size, $this->size , $this->w, $this->h );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								imageline( $img_des , 0 , 0 , 0 , ($this->size-1) , imagecolorallocate( $img_des , 220 , 220 , 220 )  );
 | 
				
			||||||
 | 
								imageline( $img_des , 0 , ($this->size-1) , ($this->size-1) , ($this->size-1) , imagecolorallocate( $img_des , 220 , 220 , 220 )  );
 | 
				
			||||||
 | 
								imageline( $img_des , ($this->size-1) , ($this->size-1) , ($this->size-1) , 0 , imagecolorallocate( $img_des , 220 , 220 , 220 )  );
 | 
				
			||||||
 | 
								imageline( $img_des , ($this->size-1) , 0 , 0 , 0 , imagecolorallocate( $img_des , 220 , 220 , 220 )  );
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								//echo $this->dest ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch ( $this->t ){
 | 
				
			||||||
 | 
									case 'gif':
 | 
				
			||||||
 | 
										if ( empty( $this->dest ) ){
 | 
				
			||||||
 | 
											header( "Content-type: image/gif" );
 | 
				
			||||||
 | 
											return ImageGIF( $img_des );
 | 
				
			||||||
 | 
										}else{
 | 
				
			||||||
 | 
											return ImageGIF( $img_des, $this->dest );
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 'jpg':
 | 
				
			||||||
 | 
										if ( empty( $this->dest ) ){
 | 
				
			||||||
 | 
											header ( "Content-type: image/jpeg" );
 | 
				
			||||||
 | 
											return ImageJPEG( $img_des );
 | 
				
			||||||
 | 
										}else{
 | 
				
			||||||
 | 
											return ImageJPEG( $img_des, $this->dest );
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									case 'png':
 | 
				
			||||||
 | 
										if ( empty( $this->dest ) ){
 | 
				
			||||||
 | 
											header ( "Content-type: image/png" );
 | 
				
			||||||
 | 
											return ImagePNG( $img_des );
 | 
				
			||||||
 | 
										}else{
 | 
				
			||||||
 | 
											return ImagePNG( $img_des, $this->dest );
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					$icon = new Icon();
 | 
				
			||||||
 | 
					$icon->path = 'a.gif';
 | 
				
			||||||
 | 
					$icon->size = 64;
 | 
				
			||||||
 | 
					$icon->dest = 'b.gif';
 | 
				
			||||||
 | 
					$icon->createIcon();
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										51
									
								
								engine/lib/Lock.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								engine/lib/Lock.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Lock{
 | 
				
			||||||
 | 
						const LOCKTIME = 3;
 | 
				
			||||||
 | 
						private static $locked = array();
 | 
				
			||||||
 | 
						private static $memcache = false;
 | 
				
			||||||
 | 
						private static function init(){
 | 
				
			||||||
 | 
							if( self::$memcache == false ){
 | 
				
			||||||
 | 
								self::$memcache = memcache_init();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function add( $key ){
 | 
				
			||||||
 | 
							self::init();
 | 
				
			||||||
 | 
							if( self::$memcache !== false ){
 | 
				
			||||||
 | 
								$time = self::LOCKTIME;
 | 
				
			||||||
 | 
								while( $time > 0 ){
 | 
				
			||||||
 | 
									if( memcache_add( self::$memcache , $key , 'Locking' ,false , self::LOCKTIME ) ){
 | 
				
			||||||
 | 
										self::$locked[$key] = 1;
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}else{
 | 
				
			||||||
 | 
										$time--;
 | 
				
			||||||
 | 
										sleep(1);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}	
 | 
				
			||||||
 | 
							}	
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function del( $key ){
 | 
				
			||||||
 | 
							if( self::$locked[$key] ){
 | 
				
			||||||
 | 
								self::init();
 | 
				
			||||||
 | 
								if( self::$memcache !== false ){
 | 
				
			||||||
 | 
									if(  memcache_delete( self::$memcache , $key  ) ){
 | 
				
			||||||
 | 
										unset(  self::$locked[$key] );
 | 
				
			||||||
 | 
										return true;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function delAll(){
 | 
				
			||||||
 | 
							if( self::$locked && self::$memcache ){
 | 
				
			||||||
 | 
								foreach( self::$locked as $k => $v ){
 | 
				
			||||||
 | 
									if( memcache_delete( self::$memcache , $k  ) ){
 | 
				
			||||||
 | 
										unset(  self::$locked[$k] );
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function autounLock(){
 | 
				
			||||||
 | 
						Lock::delAll();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					register_shutdown_function( 'autounLock' );
 | 
				
			||||||
							
								
								
									
										137
									
								
								engine/lib/Mysql.class.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								engine/lib/Mysql.class.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,137 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Mysql{
 | 
				
			||||||
 | 
						private $master;
 | 
				
			||||||
 | 
						private $slave;
 | 
				
			||||||
 | 
						public	$do_replication = false;
 | 
				
			||||||
 | 
					    function __construct( $master  ){
 | 
				
			||||||
 | 
					        $this->master = $master;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    private function connect( $is_master = true ){
 | 
				
			||||||
 | 
					        if( $is_master ) $dbInfo = $this->master;
 | 
				
			||||||
 | 
					        else $dbInfo = $this->slave;
 | 
				
			||||||
 | 
					        if( !$db = mysql_connect( $dbInfo['host'] , $dbInfo['user'] , $dbInfo['passwd'] ) ){
 | 
				
			||||||
 | 
					            die('can\'t connect to mysql ' . $ $dbInfo['host']  );
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
						       // mysql_query( "set names 'utf8'" , $db );
 | 
				
			||||||
 | 
						        mysql_query( "set names 'utf8mb4'" , $db );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        //echo 'connect to: '. $dbInfo['host'].'at db:'.$dbInfo['dbname'].'<br>';
 | 
				
			||||||
 | 
					        mysql_select_db( $dbInfo['dbname'] , $db );
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return $db;
 | 
				
			||||||
 | 
					    }  
 | 
				
			||||||
 | 
					    private function dbRead(){
 | 
				
			||||||
 | 
					        if( isset( $this->dbRead ) ){
 | 
				
			||||||
 | 
					            mysql_ping( $this->dbRead );
 | 
				
			||||||
 | 
					            return $this->dbRead;
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            if( !$this->do_replication ) return $this->dbWrite();
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                $this->dbRead = $this->connect( false );
 | 
				
			||||||
 | 
					                return $this->dbRead;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private function dbWrite(){
 | 
				
			||||||
 | 
					        if( isset( $this->dbWrite ) ){
 | 
				
			||||||
 | 
					            mysql_ping( $this->dbWrite );
 | 
				
			||||||
 | 
					            return $this->dbWrite;
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            $this->dbWrite = $this->connect( true );
 | 
				
			||||||
 | 
					            return $this->dbWrite;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public function setSlave( $slave ){
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
						    $this->slave['host'] = $slave['host'];
 | 
				
			||||||
 | 
					        $this->slave['user'] = isset($slave['user']) ? $slave['user'] : $this->master['user'];
 | 
				
			||||||
 | 
					        $this->slave['passwd'] = isset($slave['passwd']) ? $slave['passwd'] : $this->master['passwd'];
 | 
				
			||||||
 | 
					        $this->slave['dbname'] = isset($slave['dbname']) ? $slave['dbname'] : $this->master['dbname'];
 | 
				
			||||||
 | 
					        $this->do_replication = true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public function saveError() {
 | 
				
			||||||
 | 
					        //$GLOBALS['MYSQL_LAST_ERROR'] = mysql_error();
 | 
				
			||||||
 | 
					        //$GLOBALS['MYSQL_LAST_ERRNO'] = mysql_errno();
 | 
				
			||||||
 | 
					        if( mysql_errno() ){
 | 
				
			||||||
 | 
						          print_r(  mysql_error() );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function runSql( $sql ) {
 | 
				
			||||||
 | 
					        $ret = mysql_query( $sql , $this->dbWrite() );
 | 
				
			||||||
 | 
					        $this->saveError();
 | 
				
			||||||
 | 
					        return $ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public function getData( $sql , $key = NULL ){
 | 
				
			||||||
 | 
					        $GLOBALS['MYSQL_LAST_SQL'] = $sql;
 | 
				
			||||||
 | 
					        $data = Array();
 | 
				
			||||||
 | 
					        $i = 0;
 | 
				
			||||||
 | 
					        $result = mysql_query( $sql , $this->do_replication ? $this->dbRead() : $this->dbWrite()  );
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        $this->saveError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while( $Array = mysql_fetch_array($result, MYSQL_ASSOC ) ){
 | 
				
			||||||
 | 
					        	if( $key && isset( $Array[$key] ) ){
 | 
				
			||||||
 | 
						        	$data[$Array[$key]] = $Array;
 | 
				
			||||||
 | 
					        	}else{
 | 
				
			||||||
 | 
						        	$data[$i++] = $Array;
 | 
				
			||||||
 | 
					        	}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        if( mysql_errno() != 0 )
 | 
				
			||||||
 | 
					            echo mysql_error() .' ' . $sql;
 | 
				
			||||||
 | 
					        */
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        mysql_free_result($result); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( count( $data ) > 0 )
 | 
				
			||||||
 | 
					            return $data;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            return false;    
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function getLine( $sql ){
 | 
				
			||||||
 | 
					        $data = $this->getData( $sql );
 | 
				
			||||||
 | 
					        return @reset($data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function getVar( $sql ){
 | 
				
			||||||
 | 
					        $data = $this->getLine( $sql );
 | 
				
			||||||
 | 
					        return $data[ @reset(@array_keys( $data )) ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function lastId(){
 | 
				
			||||||
 | 
					        $result = mysql_query( "SELECT LAST_INSERT_ID()" , $this->dbWrite() );
 | 
				
			||||||
 | 
					        return reset( mysql_fetch_array( $result, MYSQL_ASSOC ) );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function closeDb(){
 | 
				
			||||||
 | 
					        if( isset( $this->dbRead ) ){
 | 
				
			||||||
 | 
						         @mysql_close( $this->dbRead );
 | 
				
			||||||
 | 
						         unset( $this->dbRead );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if( isset( $this->dbWrite ) ){
 | 
				
			||||||
 | 
						        @mysql_close( $this->dbWrite );
 | 
				
			||||||
 | 
						        unset( $this->dbWrite );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function escape( $str ){
 | 
				
			||||||
 | 
					        if( isset($this->dbRead)) $db = $this->dbRead ;
 | 
				
			||||||
 | 
					        elseif( isset($this->dbWrite) )    $db = $this->dbWrite;
 | 
				
			||||||
 | 
					        else $db = $this->dbRead();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return mysql_real_escape_string( $str , $db );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function errno(){
 | 
				
			||||||
 | 
					        return  $GLOBALS['MYSQL_LAST_ERRNO'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function error(){
 | 
				
			||||||
 | 
					        return $GLOBALS['MYSQL_LAST_ERROR'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										676
									
								
								engine/lib/SafeHtml.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										676
									
								
								engine/lib/SafeHtml.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,676 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * HTML_Safe Parser
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * PHP versions 4 and 5
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @category   HTML
 | 
				
			||||||
 | 
					 * @package    HTML_Safe
 | 
				
			||||||
 | 
					 * @author     Roman Ivanov <thingol@mail.ru>
 | 
				
			||||||
 | 
					 * @copyright  2004-2005 Roman Ivanov
 | 
				
			||||||
 | 
					 * @license    http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
 | 
				
			||||||
 | 
					 * @version    CVS: $Id:$
 | 
				
			||||||
 | 
					 * @link       http://pear.php.net/package/HTML_Safe
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This package requires HTMLSax3 package
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					require_once __DIR__.'/XML/HTMLSax3.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * HTML_Safe Parser
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This parser strips down all potentially dangerous content within HTML:
 | 
				
			||||||
 | 
					 * <ul>
 | 
				
			||||||
 | 
					 * <li>opening tag without its closing tag</li>
 | 
				
			||||||
 | 
					 * <li>closing tag without its opening tag</li>
 | 
				
			||||||
 | 
					 * <li>any of these tags: "base", "basefont", "head", "html", "body", "applet", 
 | 
				
			||||||
 | 
					 * "object", "iframe", "frame", "frameset", "script", "layer", "ilayer", "embed", 
 | 
				
			||||||
 | 
					 * "bgsound", "link", "meta", "style", "title", "blink", "xml" etc.</li>
 | 
				
			||||||
 | 
					 * <li>any of these attributes: on*, data*, dynsrc</li>
 | 
				
			||||||
 | 
					 * <li>javascript:/vbscript:/about: etc. protocols</li>
 | 
				
			||||||
 | 
					 * <li>expression/behavior etc. in styles</li>
 | 
				
			||||||
 | 
					 * <li>any other active content</li>
 | 
				
			||||||
 | 
					 * </ul>
 | 
				
			||||||
 | 
					 * It also tries to convert code to XHTML valid, but htmltidy is far better 
 | 
				
			||||||
 | 
					 * solution for this task.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * <b>Example:</b>
 | 
				
			||||||
 | 
					 * <pre>
 | 
				
			||||||
 | 
					 * $parser =new HTML_Safe();
 | 
				
			||||||
 | 
					 * $result = $parser->parse($doc);
 | 
				
			||||||
 | 
					 * </pre>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @category   HTML
 | 
				
			||||||
 | 
					 * @package    HTML_Safe
 | 
				
			||||||
 | 
					 * @author     Roman Ivanov <thingol@mail.ru>
 | 
				
			||||||
 | 
					 * @copyright  1997-2005 Roman Ivanov
 | 
				
			||||||
 | 
					 * @license    http://www.debian.org/misc/bsd.license  BSD License (3 Clause)
 | 
				
			||||||
 | 
					 * @version    Release: @package_version@
 | 
				
			||||||
 | 
					 * @link       http://pear.php.net/package/HTML_Safe
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class SafeHtml 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Storage for resulting HTML output
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var string
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_xhtml = '';
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Array of counters for each tag
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_counter = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Stack of unclosed tags
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_stack = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Array of counters for tags that must be deleted with all content
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_dcCounter = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Stack of unclosed tags that must be deleted with all content
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_dcStack = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Stores level of list (ol/ul) nesting
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var int
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_listScope = 0; 
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Stack of unclosed list tags 
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_liStack = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Array of prepared regular expressions for protocols (schemas) matching
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_protoRegexps = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Array of prepared regular expressions for CSS matching
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $_cssRegexps = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of single tags ("<tag />")
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $singleTags = array('area', 'br', 'img', 'input', 'hr', 'wbr', );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of dangerous tags (such tags will be deleted)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $deleteTags = array(
 | 
				
			||||||
 | 
					        'applet', 'base',   'basefont', 'bgsound', 'blink',  'body', 
 | 
				
			||||||
 | 
					        'embed',  'frame',  'frameset', 'head',    'html',   'ilayer', 
 | 
				
			||||||
 | 
					        'iframe', 'layer',  'link',     'meta',    'object', 'style', 
 | 
				
			||||||
 | 
					        'title',  'script', 
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of dangerous tags (such tags will be deleted, and all content 
 | 
				
			||||||
 | 
					     * inside this tags will be also removed)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $deleteTagsContent = array('script', 'style', 'title', 'xml', );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Type of protocols filtering ('white' or 'black')
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var string
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $protocolFiltering = 'white';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of "dangerous" protocols (used for blacklist-filtering)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $blackProtocols = array(
 | 
				
			||||||
 | 
					        'about',   'chrome',     'data',       'disk',     'hcp',     
 | 
				
			||||||
 | 
					        'help',    'javascript', 'livescript', 'lynxcgi',  'lynxexec', 
 | 
				
			||||||
 | 
					        'ms-help', 'ms-its',     'mhtml',      'mocha',    'opera',   
 | 
				
			||||||
 | 
					        'res',     'resource',   'shell',      'vbscript', 'view-source', 
 | 
				
			||||||
 | 
					        'vnd.ms.radio',          'wysiwyg', 
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of "safe" protocols (used for whitelist-filtering)
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $whiteProtocols = array(
 | 
				
			||||||
 | 
					        'ed2k',   'file', 'ftp',  'gopher', 'http',  'https', 
 | 
				
			||||||
 | 
					        'irc',    'mailto', 'news', 'nntp', 'telnet', 'webcal', 
 | 
				
			||||||
 | 
					        'xmpp',   'callto',
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of attributes that can contain protocols
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $protocolAttributes = array(
 | 
				
			||||||
 | 
					        'action', 'background', 'codebase', 'dynsrc', 'href', 'lowsrc', 'src', 
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of dangerous CSS keywords
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Whole style="" attribute will be removed, if parser will find one of 
 | 
				
			||||||
 | 
					     * these keywords
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $cssKeywords = array(
 | 
				
			||||||
 | 
					        'absolute', 'behavior',       'behaviour',   'content', 'expression', 
 | 
				
			||||||
 | 
					        'fixed',    'include-source', 'moz-binding',
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of tags that can have no "closing tag"
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     * @deprecated XHTML does not allow such tags
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $noClose = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of block-level tags that terminates paragraph
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Paragraph will be closed when this tags opened
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $closeParagraph = array(
 | 
				
			||||||
 | 
					        'address', 'blockquote', 'center', 'dd',      'dir',       'div', 
 | 
				
			||||||
 | 
					        'dl',      'dt',         'h1',     'h2',      'h3',        'h4', 
 | 
				
			||||||
 | 
					        'h5',      'h6',         'hr',     'isindex', 'listing',   'marquee', 
 | 
				
			||||||
 | 
					        'menu',    'multicol',   'ol',     'p',       'plaintext', 'pre', 
 | 
				
			||||||
 | 
					        'table',   'ul',         'xmp', 
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of table tags, all table tags outside a table will be removed
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $tableTags = array(
 | 
				
			||||||
 | 
					        'caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', 
 | 
				
			||||||
 | 
					        'thead',   'tr', 
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of list tags
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $listTags = array('dir', 'menu', 'ol', 'ul', 'dl', );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of dangerous attributes
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $attributes = array('dynsrc', 'name', );
 | 
				
			||||||
 | 
					     /**
 | 
				
			||||||
 | 
					     * List of delete attributes
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $deleteAttrs = array( 'id', 'class', 'urltoajax', 'action-data', 'action-type', 'confirm', 'hovertip', 'textcount',);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * List of allowed "namespaced" attributes
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @var array
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    var $attributesNS = array('xml:lang', );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Constructs class
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function HTML_Safe() 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //making regular expressions based on Proto & CSS arrays
 | 
				
			||||||
 | 
					        foreach ($this->blackProtocols as $proto) {
 | 
				
			||||||
 | 
					            $preg = "/[\s\x01-\x1F]*";
 | 
				
			||||||
 | 
					            for ($i=0; $i<strlen($proto); $i++) {
 | 
				
			||||||
 | 
					                $preg .= $proto{$i} . "[\s\x01-\x1F]*";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            $preg .= ":/i";
 | 
				
			||||||
 | 
					            $this->_protoRegexps[] = $preg;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        foreach ($this->cssKeywords as $css) {
 | 
				
			||||||
 | 
					            $this->_cssRegexps[] = '/' . $css . '/i';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Handles the writing of attributes - called from $this->_openHandler()
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param array $attrs array of attributes $name => $value
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _writeAttrs ($attrs) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (is_array($attrs) ) {
 | 
				
			||||||
 | 
					            foreach ($attrs as $name => $value) {
 | 
				
			||||||
 | 
					                $name = strtolower($name);
 | 
				
			||||||
 | 
					                if(in_array( $name , $this->deleteAttrs )){
 | 
				
			||||||
 | 
							            continue;
 | 
				
			||||||
 | 
						            }
 | 
				
			||||||
 | 
					                if (strpos($name, 'on') === 0) {
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (strpos($name, 'data') === 0) {
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (in_array($name, $this->attributes)) {
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (!preg_match("/^[a-z0-9]+$/i", $name)) {
 | 
				
			||||||
 | 
					                    if (!in_array($name, $this->attributesNS)) {
 | 
				
			||||||
 | 
					                        continue;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (($value === TRUE) || (is_null($value))) {
 | 
				
			||||||
 | 
					                    $value = $name;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ($name == 'style') {
 | 
				
			||||||
 | 
					                   
 | 
				
			||||||
 | 
					                   // removes insignificant backslahes
 | 
				
			||||||
 | 
					                   $value = str_replace("\\", '', $value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   // removes CSS comments
 | 
				
			||||||
 | 
					                   while (1)
 | 
				
			||||||
 | 
					                   {
 | 
				
			||||||
 | 
					                     $_value = preg_replace("!/\*.*?\*/!s", '', $value);
 | 
				
			||||||
 | 
					                     if ($_value == $value) break;
 | 
				
			||||||
 | 
					                     $value = $_value;
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					                   
 | 
				
			||||||
 | 
					                   // replace all & to &
 | 
				
			||||||
 | 
					                   $value = str_replace('&', '&', $value);
 | 
				
			||||||
 | 
					                   $value = str_replace('&', '&', $value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                   foreach ($this->_cssRegexps as $css) {
 | 
				
			||||||
 | 
					                       if (preg_match($css, $value)) { 
 | 
				
			||||||
 | 
					                           continue 2;
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					                   foreach ($this->_protoRegexps as $proto) {
 | 
				
			||||||
 | 
					                       if (preg_match($proto, $value)) {
 | 
				
			||||||
 | 
					                           continue 2;
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $tempval = preg_replace('/&#(\d+);?/me', "chr('\\1')", $value); //"'
 | 
				
			||||||
 | 
					                $tempval = preg_replace('/&#x([0-9a-f]+);?/mei', "chr(hexdec('\\1'))", $tempval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if ((in_array($name, $this->protocolAttributes)) && 
 | 
				
			||||||
 | 
					                    (strpos($tempval, ':') !== false)) 
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if ($this->protocolFiltering == 'black') {
 | 
				
			||||||
 | 
					                        foreach ($this->_protoRegexps as $proto) {
 | 
				
			||||||
 | 
					                            if (preg_match($proto, $tempval)) continue 2;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        $_tempval = explode(':', $tempval);
 | 
				
			||||||
 | 
					                        $proto = $_tempval[0];
 | 
				
			||||||
 | 
					                        if (!in_array($proto, $this->whiteProtocols)) {
 | 
				
			||||||
 | 
					                            continue;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                $value = str_replace("\"", """, $value);
 | 
				
			||||||
 | 
					                $this->_xhtml .= ' ' . $name . '="' . $value . '"';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Opening tag handler - called from HTMLSax
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param object $parser HTML Parser
 | 
				
			||||||
 | 
					     * @param string $name   tag name
 | 
				
			||||||
 | 
					     * @param array  $attrs  tag attributes
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _openHandler(&$parser, $name, $attrs) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $name = strtolower($name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (in_array($name, $this->deleteTagsContent)) {
 | 
				
			||||||
 | 
					            array_push($this->_dcStack, $name);
 | 
				
			||||||
 | 
					            $this->_dcCounter[$name] = isset($this->_dcCounter[$name]) ? $this->_dcCounter[$name]+1 : 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (count($this->_dcStack) != 0) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (in_array($name, $this->deleteTags)) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (!preg_match("/^[a-z0-9]+$/i", $name)) {
 | 
				
			||||||
 | 
					            if (preg_match("!(?:\@|://)!i", $name)) {
 | 
				
			||||||
 | 
					                $this->_xhtml .= '<' . $name . '>';
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (in_array($name, $this->singleTags)) {
 | 
				
			||||||
 | 
					            $this->_xhtml .= '<' . $name;
 | 
				
			||||||
 | 
					            $this->_writeAttrs($attrs);
 | 
				
			||||||
 | 
					            $this->_xhtml .= ' />';
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // TABLES: cannot open table elements when we are not inside table
 | 
				
			||||||
 | 
					        if ((isset($this->_counter['table'])) && ($this->_counter['table'] <= 0) 
 | 
				
			||||||
 | 
					            && (in_array($name, $this->tableTags))) 
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // PARAGRAPHS: close paragraph when closeParagraph tags opening
 | 
				
			||||||
 | 
					        if ((in_array($name, $this->closeParagraph)) && (in_array('p', $this->_stack))) {
 | 
				
			||||||
 | 
					            $this->_closeHandler($parser, 'p');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // LISTS: we should close <li> if <li> of the same level opening
 | 
				
			||||||
 | 
					        if ($name == 'li' && count($this->_liStack) && 
 | 
				
			||||||
 | 
					            $this->_listScope == $this->_liStack[count($this->_liStack)-1]) 
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            $this->_closeHandler($parser, 'li');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // LISTS: we want to know on what nesting level of lists we are
 | 
				
			||||||
 | 
					        if (in_array($name, $this->listTags)) {
 | 
				
			||||||
 | 
					            $this->_listScope++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($name == 'li') {
 | 
				
			||||||
 | 
					            array_push($this->_liStack, $this->_listScope);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        $this->_xhtml .= '<' . $name;
 | 
				
			||||||
 | 
					        $this->_writeAttrs($attrs);
 | 
				
			||||||
 | 
					        $this->_xhtml .= '>';
 | 
				
			||||||
 | 
					        array_push($this->_stack,$name);
 | 
				
			||||||
 | 
					        $this->_counter[$name] = isset($this->_counter[$name]) ? $this->_counter[$name]+1 : 1;
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Closing tag handler - called from HTMLSax
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param object $parsers HTML parser
 | 
				
			||||||
 | 
					     * @param string $name    tag name
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _closeHandler(&$parser, $name) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $name = strtolower($name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isset($this->_dcCounter[$name]) && ($this->_dcCounter[$name] > 0) && 
 | 
				
			||||||
 | 
					            (in_array($name, $this->deleteTagsContent))) 
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					           while ($name != ($tag = array_pop($this->_dcStack))) {
 | 
				
			||||||
 | 
					            $this->_dcCounter[$tag]--;
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           $this->_dcCounter[$name]--;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (count($this->_dcStack) != 0) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ((isset($this->_counter[$name])) && ($this->_counter[$name] > 0)) {
 | 
				
			||||||
 | 
					           while ($name != ($tag = array_pop($this->_stack))) {
 | 
				
			||||||
 | 
					               $this->_closeTag($tag);
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           $this->_closeTag($name);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Closes tag 
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $tag tag name
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _closeTag($tag) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (!in_array($tag, $this->noClose)) {
 | 
				
			||||||
 | 
					            $this->_xhtml .= '</' . $tag . '>';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->_counter[$tag]--;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (in_array($tag, $this->listTags)) {
 | 
				
			||||||
 | 
					            $this->_listScope--;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($tag == 'li') {
 | 
				
			||||||
 | 
					            array_pop($this->_liStack);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Character data handler - called from HTMLSax
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param object $parser HTML parser
 | 
				
			||||||
 | 
					     * @param string $data   textual data
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _dataHandler(&$parser, $data) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (count($this->_dcStack) == 0) {
 | 
				
			||||||
 | 
					            $this->_xhtml .= $data;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Escape handler - called from HTMLSax
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param object $parser HTML parser
 | 
				
			||||||
 | 
					     * @param string $data   comments or other type of data
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function _escapeHandler(&$parser, $data) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns the XHTML document
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return string Processed (X)HTML document
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function getXHTML () 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        while ($tag = array_pop($this->_stack)) {
 | 
				
			||||||
 | 
					            $this->_closeTag($tag);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return $this->_xhtml;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Clears current document data
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return boolean
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function clear() 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->_xhtml = '';
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Main parsing fuction
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $doc HTML document for processing
 | 
				
			||||||
 | 
					     * @return string Processed (X)HTML document
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function parse($doc) 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Save all '<' symbols
 | 
				
			||||||
 | 
					       $doc = preg_replace("/<(?=[^a-zA-Z\/\!\?\%])/", '<', $doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Web documents shouldn't contains \x00 symbol
 | 
				
			||||||
 | 
					       $doc = str_replace("\x00", '', $doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Opera6 bug workaround
 | 
				
			||||||
 | 
					       $doc = str_replace("\xC0\xBC", '<', $doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // UTF-7 encoding ASCII decode
 | 
				
			||||||
 | 
					       $doc = $this->repackUTF7($doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Instantiate the parser
 | 
				
			||||||
 | 
					       $parser=new XML_HTMLSax3();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       // Set up the parser
 | 
				
			||||||
 | 
					       $parser->set_object($this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       $parser->set_element_handler('_openHandler','_closeHandler');
 | 
				
			||||||
 | 
					       $parser->set_data_handler('_dataHandler');
 | 
				
			||||||
 | 
					       $parser->set_escape_handler('_escapeHandler');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       $parser->parse($doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       return $this->getXHTML();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * UTF-7 decoding fuction
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $str HTML document for recode ASCII part of UTF-7 back to ASCII
 | 
				
			||||||
 | 
					     * @return string Decoded document
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function repackUTF7($str)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       return preg_replace_callback('!\+([0-9a-zA-Z/]+)\-!', array($this, 'repackUTF7Callback'), $str);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Additional UTF-7 decoding fuction
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $str String for recode ASCII part of UTF-7 back to ASCII
 | 
				
			||||||
 | 
					     * @return string Recoded string
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function repackUTF7Callback($str)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       $str = base64_decode($str[1]);
 | 
				
			||||||
 | 
					       $str = preg_replace_callback('/^((?:\x00.)*)((?:[^\x00].)+)/', array($this, 'repackUTF7Back'), $str);
 | 
				
			||||||
 | 
					       return preg_replace('/\x00(.)/', '$1', $str);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Additional UTF-7 encoding fuction
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $str String for recode ASCII part of UTF-7 back to ASCII
 | 
				
			||||||
 | 
					     * @return string Recoded string
 | 
				
			||||||
 | 
					     * @access private
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    function repackUTF7Back($str)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       return $str[1].'+'.rtrim(base64_encode($str[2]), '=').'-';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local variables:
 | 
				
			||||||
 | 
					 * tab-width: 4
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * c-hanging-comment-ender-p: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										167
									
								
								engine/lib/Thumbnail.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										167
									
								
								engine/lib/Thumbnail.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,167 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Author: Blaz Grapar, blaz.grapar@email.si
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please don't delete my name in the script. Thanks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This simple class creates a thumbnail of an image. Size of thumbnail is determined with maximum width and height of an thumbnail.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXAMPLE:
 | 
				
			||||||
 | 
					$myThumb = new Thumbnail; // Start using a class
 | 
				
			||||||
 | 
					$myThumb->setMaxSize( 200, 200 ); // Specify maximum size (width, height)
 | 
				
			||||||
 | 
					$myThumb->setImgSource(	'image_original.jpg' ); // Specify original image filename
 | 
				
			||||||
 | 
					$myThumb->Create( 'image_thumbnail.jpg' ); // Specify destination image filename or leave empty to output directly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can also get additional info about original image or thumbnail...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$myThumb = new Thumbnail; // Start using a class
 | 
				
			||||||
 | 
					$myThumb->setImgSource(	'image_original.jpg' ); // Specify original image filename
 | 
				
			||||||
 | 
					$myThumb->getImageData( 'width' ) // This will get you pixel width of original image. getImageData arguments are width|height|type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can also use getThumbData to see the size of thumbnail that will be created.
 | 
				
			||||||
 | 
					$myThumb = new Thumbnail; // Start using a class
 | 
				
			||||||
 | 
					$myThumb->setMaxSize( 200, 200 ); // Specify maximum size (width, height)
 | 
				
			||||||
 | 
					$myThumb->getThumbData( 'width' ) // This will get you pixel width of thumbnail image. getImageData arguments are width|height|type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Thumbnail
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set destination filename
 | 
				
			||||||
 | 
						function setImgSource( $source )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							$this->source = $source;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set maximum size of thumbnail
 | 
				
			||||||
 | 
						function setMaxSize ( $max_width = 100, $max_height = 100 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							$this->max_width = $max_width;
 | 
				
			||||||
 | 
							$this->max_height = $max_height;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get info about original image
 | 
				
			||||||
 | 
						function getImageData( $data )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							$size = getimagesize( $this->source );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch ( $data )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case 'width':
 | 
				
			||||||
 | 
								return $size[0];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'height':
 | 
				
			||||||
 | 
								return $size[1];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'type':
 | 
				
			||||||
 | 
								switch ( $size[2] )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
								case 1:
 | 
				
			||||||
 | 
									return 'gif';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
									return 'jpg';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case 3:
 | 
				
			||||||
 | 
									return 'png';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get info about thumbnail
 | 
				
			||||||
 | 
						function getThumbData( $data ){
 | 
				
			||||||
 | 
							$w_ratio = $this->max_width  / $this->GetImageData('width');
 | 
				
			||||||
 | 
							$h_ratio = $this->max_height / $this->GetImageData('height');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( $h_ratio < $w_ratio ){
 | 
				
			||||||
 | 
								$height = $this->max_height;
 | 
				
			||||||
 | 
								$width = round( $this->GetImageData('width') * $h_ratio, 0);
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$width = $this->max_width;
 | 
				
			||||||
 | 
								$height = round( $this->GetImageData('height') * $w_ratio, 0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch ( $data ){
 | 
				
			||||||
 | 
							case 'width':
 | 
				
			||||||
 | 
								return $width;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'height':
 | 
				
			||||||
 | 
								return $height;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Creating a thumbnail
 | 
				
			||||||
 | 
						function Create( $dest = NULL ){
 | 
				
			||||||
 | 
							$img_des = imagecreatetruecolor( $this->GetThumbData('width'), $this->GetThumbData('height') );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$background = imagecolorallocate( $img_des , 255 , 255 , 255 );
 | 
				
			||||||
 | 
							imagefill( $img_des , 0 , 0 , $background );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch ( $this->GetImageData('type') ){
 | 
				
			||||||
 | 
							case 'gif':
 | 
				
			||||||
 | 
								$img_src = imagecreatefromgif( $this->source );
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'jpg':
 | 
				
			||||||
 | 
								$img_src = imagecreatefromjpeg( $this->source );
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'png':
 | 
				
			||||||
 | 
								$img_src = imagecreatefrompng( $this->source );
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// GD 1.0
 | 
				
			||||||
 | 
							//ImageCopyResized( $img_des, $img_src, 0, 0, 0, 0, $this->GetThumbData('width'), $this->GetThumbData('height'), $this->GetImageData('width'), $this->GetImageData('height') );
 | 
				
			||||||
 | 
							// GD 2.0
 | 
				
			||||||
 | 
							imagecopyresampled( $img_des, $img_src, 0, 0, 0, 0, $this->GetThumbData('width'), $this->GetThumbData('height'), $this->GetImageData('width'), $this->GetImageData('height') );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch ( $this->GetImageData('type') ){
 | 
				
			||||||
 | 
							case 'gif':
 | 
				
			||||||
 | 
								if ( empty( $dest ) ){
 | 
				
			||||||
 | 
									ob_start();
 | 
				
			||||||
 | 
									//header( "Content-type: image/gif" );
 | 
				
			||||||
 | 
									imagegif( $img_des );
 | 
				
			||||||
 | 
									$return = ob_get_clean();
 | 
				
			||||||
 | 
									return $return;
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									return imagegif( $img_des, $dest );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'jpg':
 | 
				
			||||||
 | 
								if ( empty( $dest ) ){
 | 
				
			||||||
 | 
									ob_start();
 | 
				
			||||||
 | 
									//header ( "Content-type: image/jpeg" );
 | 
				
			||||||
 | 
									imagejpeg( $img_des );
 | 
				
			||||||
 | 
									$return = ob_get_clean();
 | 
				
			||||||
 | 
									return $return;
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									return imagejpeg( $img_des, $dest );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case 'png':
 | 
				
			||||||
 | 
								if ( empty( $dest ) ){
 | 
				
			||||||
 | 
									ob_start();
 | 
				
			||||||
 | 
									//header ( "Content-type: image/png" );
 | 
				
			||||||
 | 
									imagepng( $img_des );
 | 
				
			||||||
 | 
									$return = ob_get_clean();
 | 
				
			||||||
 | 
									return $return;
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									return imagepng( $img_des, $dest );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										147
									
								
								engine/lib/Url.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										147
									
								
								engine/lib/Url.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,147 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class Url{
 | 
				
			||||||
 | 
						const	SHORT_CLASS_TAG = 'c';
 | 
				
			||||||
 | 
						const	SHORT_METHOD_TAG = 'm';
 | 
				
			||||||
 | 
						const	URLBASE = '/';
 | 
				
			||||||
 | 
						public static $enter = array();
 | 
				
			||||||
 | 
						public static $params = array();
 | 
				
			||||||
 | 
						public static $custom = array();
 | 
				
			||||||
 | 
						public static $url = false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static function setUrl( $url ){
 | 
				
			||||||
 | 
							self::$enter = self::$params = array();
 | 
				
			||||||
 | 
							self::$url = $url;
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function getUrl(){
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
							return self::$url;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function get( $str ){
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
							return isset( self::$params[$str] )?self::$params[$str]:false ;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function getClass(){
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
							return self::$enter['class'];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function getMethod(){
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
							return self::$enter['method'];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function make( $custom  = array() , $old = array() ){
 | 
				
			||||||
 | 
							self::initParams();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$base = array();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							self::formatUrlParams( $base , $custom , $old  );
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							//$base[self::SHORT_CLASS_TAG] = $base[self::SHORT_CLASS_TAG]?:self::getClass();
 | 
				
			||||||
 | 
							//$base[self::SHORT_METHOD_TAG] = $base[self::SHORT_METHOD_TAG]?:c('default_method');
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if( !$base[self::SHORT_CLASS_TAG] ){
 | 
				
			||||||
 | 
								$base[self::SHORT_CLASS_TAG] = self::getClass();
 | 
				
			||||||
 | 
								if( !$base[self::SHORT_METHOD_TAG] ){
 | 
				
			||||||
 | 
									$base[self::SHORT_METHOD_TAG] = self::getMethod();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if( !$base[self::SHORT_METHOD_TAG] ){
 | 
				
			||||||
 | 
								$base[self::SHORT_METHOD_TAG] = c('default_method');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if( $base[self::SHORT_METHOD_TAG]== c('default_method') ){
 | 
				
			||||||
 | 
								unset( $base[self::SHORT_METHOD_TAG]  );
 | 
				
			||||||
 | 
								if( !$custom && !$old &&  $base[self::SHORT_CLASS_TAG]== c('default_class')  ){
 | 
				
			||||||
 | 
									unset( $base[self::SHORT_CLASS_TAG]  );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							//start to make url 
 | 
				
			||||||
 | 
							$url = c('url_base')?c('url_base'):self::URLBASE;
 | 
				
			||||||
 | 
							if( c('static_url') ){
 | 
				
			||||||
 | 
								if( $base )
 | 
				
			||||||
 | 
									$url .= join('/',$base).'/';
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								if( $custom ){
 | 
				
			||||||
 | 
									foreach( $custom as $k => $v ){
 | 
				
			||||||
 | 
										if( $v ){
 | 
				
			||||||
 | 
											$url .= $k.'/'.$v.'/';
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								if( $base )
 | 
				
			||||||
 | 
									$custom += $base;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								if( $custom )
 | 
				
			||||||
 | 
									$url .= '?'.http_build_query($custom); 
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return $url;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public static function initParams(){
 | 
				
			||||||
 | 
							if( !self::$enter ){
 | 
				
			||||||
 | 
								$custom = array();
 | 
				
			||||||
 | 
								if( !self::$url ){
 | 
				
			||||||
 | 
									if( c('static_url')  ){
 | 
				
			||||||
 | 
										self::$url = isset($_SERVER['REDIRECT_URL'])&&$_SERVER['REDIRECT_URL']?$_SERVER['REDIRECT_URL']:$_SERVER['PATH_INFO'];
 | 
				
			||||||
 | 
									}else{
 | 
				
			||||||
 | 
										self::$url = $_GET;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if( c('static_url') ){
 | 
				
			||||||
 | 
									$tempArray = explode( '/' , trim(self::$url , '/' )  );
 | 
				
			||||||
 | 
									if( $tempArray ){
 | 
				
			||||||
 | 
										if( count( $tempArray )%2 == 0 ){
 | 
				
			||||||
 | 
											$custom['class'] = safeUrlString(array_shift( $tempArray ));
 | 
				
			||||||
 | 
											$custom['method'] = safeUrlString(array_shift( $tempArray ));
 | 
				
			||||||
 | 
										}else{
 | 
				
			||||||
 | 
											$custom['class'] = safeUrlString(array_shift( $tempArray ));
 | 
				
			||||||
 | 
											$custom['method'] = c('default_method');
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if( $tempArray ){
 | 
				
			||||||
 | 
										foreach( array_chunk($tempArray, 2) as $v ){
 | 
				
			||||||
 | 
											list( $key , $value ) = $v;
 | 
				
			||||||
 | 
											$custom[$key] = $value;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									$custom = self::$url;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$base = array();
 | 
				
			||||||
 | 
								self::formatUrlParams( $base , $custom );
 | 
				
			||||||
 | 
								self::$enter['class'] = $base[self::SHORT_CLASS_TAG]?:c('default_class');
 | 
				
			||||||
 | 
								self::$enter['method'] = $base[self::SHORT_METHOD_TAG]?:c('default_method');
 | 
				
			||||||
 | 
								self::$params = $custom;
 | 
				
			||||||
 | 
								if( c('static_url') ){
 | 
				
			||||||
 | 
									$_REQUEST += $base + $custom;
 | 
				
			||||||
 | 
									$_GET += $base + $custom;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private static function formatUrlParams(  &$base , &$custom , $old = array() ){
 | 
				
			||||||
 | 
							// init url params
 | 
				
			||||||
 | 
							if( !is_array( $custom ) ){
 | 
				
			||||||
 | 
								parse_str( ltrim( $custom , '?' ) , $custom);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$custom += self::$custom;
 | 
				
			||||||
 | 
							if( $old ){
 | 
				
			||||||
 | 
								foreach( $old as $v ){
 | 
				
			||||||
 | 
									if( $v && self::$params[$v] ){
 | 
				
			||||||
 | 
										$custom[$v] = self::$params[$v];
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							//init custom params
 | 
				
			||||||
 | 
							$needFix = array( 'class' , 'method' , self::SHORT_CLASS_TAG , self::SHORT_CLASS_TAG );
 | 
				
			||||||
 | 
							foreach( $needFix  as $v ){
 | 
				
			||||||
 | 
								$custom[$v] = $custom[$v]?:NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$class = $custom[self::SHORT_CLASS_TAG]?:$custom['class'];
 | 
				
			||||||
 | 
							$method = $custom[self::SHORT_METHOD_TAG]?:$custom['method'];
 | 
				
			||||||
 | 
							unset( $custom['class'], $custom[self::SHORT_CLASS_TAG] , $custom['method'] ,$custom[self::SHORT_METHOD_TAG] );
 | 
				
			||||||
 | 
							$base[self::SHORT_CLASS_TAG] = $class;
 | 
				
			||||||
 | 
							$base[self::SHORT_METHOD_TAG] = $method;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										64
									
								
								engine/lib/Weibo.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								engine/lib/Weibo.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					Class Weibo{
 | 
				
			||||||
 | 
						private static $weiboClient,$weiboOAuth;
 | 
				
			||||||
 | 
						private static $akey,$skey,$access_token,$refresh_token;
 | 
				
			||||||
 | 
						private static $ip;
 | 
				
			||||||
 | 
						public static function init(  $akey, $skey, $access_token = NULL , $refresh_token = NULL  ){
 | 
				
			||||||
 | 
							self::$akey = $akey; self::$skey = $skey; self::$access_token = $access_token; self::$refresh_token = $refresh_token;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static function setIp( $ip ){
 | 
				
			||||||
 | 
							self::$ip = $ip;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static function __callStatic($funcName, $args){
 | 
				
			||||||
 | 
							if( !self::$akey && !self::$skey ){
 | 
				
			||||||
 | 
								die( 'Weibo Class is not init.' );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							self::initWeiboClient();
 | 
				
			||||||
 | 
							if( self::$weiboClient ){
 | 
				
			||||||
 | 
								if( method_exists(self::$weiboClient ,$funcName ) ){
 | 
				
			||||||
 | 
									$res = call_user_func_array(array(self::$weiboClient , $funcName) , $args );
 | 
				
			||||||
 | 
									if( $fun = c('after_weibo') ){
 | 
				
			||||||
 | 
										if( function_exists( $fun ) ){
 | 
				
			||||||
 | 
											$fun( $res );
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return $res;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							self::initWeiboOAuth();
 | 
				
			||||||
 | 
							if( self::$weiboOAuth ){
 | 
				
			||||||
 | 
								if( method_exists(self::$weiboOAuth ,$funcName ) ){
 | 
				
			||||||
 | 
									if( $funcName == 'getAccessToken' ){
 | 
				
			||||||
 | 
										$token = call_user_func_array( array(self::$weiboOAuth ,$funcName ), $args );
 | 
				
			||||||
 | 
										if( !self::$weiboClient && $token['access_token'] ){
 | 
				
			||||||
 | 
											self::$access_token = $token['access_token'];
 | 
				
			||||||
 | 
											self::initWeiboClient();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										return $token;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return call_user_func_array( array(self::$weiboOAuth ,$funcName ), $args );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							die( 'Function '.$funcName.' is not find in Weibo Class' );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private static function initWeiboClient(){
 | 
				
			||||||
 | 
							if( !self::$weiboClient && self::$access_token ){
 | 
				
			||||||
 | 
								include_once( "saetv2.ex.class.php" );
 | 
				
			||||||
 | 
								self::$weiboClient = new SaeTClientV2(  self::$akey,  self::$skey,  self::$access_token, self::$refresh_token );
 | 
				
			||||||
 | 
								if( self::$ip ){
 | 
				
			||||||
 | 
									self::$weiboClient->set_remote_ip( self::$ip );
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						private static function initWeiboOAuth(){
 | 
				
			||||||
 | 
							if( !self::$weiboOAuth ){
 | 
				
			||||||
 | 
								include_once( "saetv2.ex.class.php" );
 | 
				
			||||||
 | 
								self::$weiboOAuth = new SaeTOAuthV2(  self::$akey,  self::$skey,  self::$access_token, self::$refresh_token );
 | 
				
			||||||
 | 
								if( self::$ip ){
 | 
				
			||||||
 | 
									self::$weiboOAuth->remote_ip = self::$ip;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										688
									
								
								engine/lib/XML/HTMLSax3.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										688
									
								
								engine/lib/XML/HTMLSax3.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,688 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/* vim: set expandtab tabstop=4 shiftwidth=4: */
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | PHP Version 4                                                        |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Copyright (c) 1997-2002 The PHP Group                                |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | This source file is subject toversion 3.0 of the PHP license,      |
 | 
				
			||||||
 | 
					// | that is bundled with this package in the file LICENSE, and is        |
 | 
				
			||||||
 | 
					// | available at through the world-wide-web at                           |
 | 
				
			||||||
 | 
					// | http://www.php.net/license/3_0.txt.                                  |
 | 
				
			||||||
 | 
					// | If you did not receive a copy of the PHP license and are unable to   |
 | 
				
			||||||
 | 
					// | obtain it through the world-wide-web, please send a note to          |
 | 
				
			||||||
 | 
					// | license@php.net so we can mail you a copy immediately.               |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
 | 
				
			||||||
 | 
					// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more  |
 | 
				
			||||||
 | 
					// | Authors: Many @ Sitepointforums Advanced PHP Forums                  |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// $Id: HTMLSax3.php,v 1.2 2007/10/29 21:41:34 hfuecks Exp $
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Main parser components
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @version $Id: HTMLSax3.php,v 1.2 2007/10/29 21:41:34 hfuecks Exp $
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Required classes
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3', 'XML/');
 | 
				
			||||||
 | 
					if (!defined('XML_HTMLSAX3')) {
 | 
				
			||||||
 | 
					    define('XML_HTMLSAX3', 'XML/');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					require_once(__DIR__ . '/HTMLSax3/States.php');
 | 
				
			||||||
 | 
					require_once(__DIR__ . '/HTMLSax3/Decorators.php');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Base State Parser
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					* @abstract
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_StateParser {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Instance of user front end class to be passed to callbacks
 | 
				
			||||||
 | 
					    * @var XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $htmlsax;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined object for handling elements
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_object_element;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined open tag handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_opening;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined close tag handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_closing;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined object for handling data in elements
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_object_data;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined data handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_data;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined object for handling processing instructions
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_object_pi;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined processing instruction handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_pi;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined object for handling JSP/ASP tags
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_object_jasp;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined JSP/ASP handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_jasp;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined object for handling XML escapes
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_object_escape;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined XML escape handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_method_escape;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * User defined handler object or NullHandler
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $handler_default;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Parser options determining parsing behavior
 | 
				
			||||||
 | 
					    * @var array
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $parser_options = array();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * XML document being parsed
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $rawtext;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Position in XML document relative to start (0)
 | 
				
			||||||
 | 
					    * @var int
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $position;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Length of the XML document in characters
 | 
				
			||||||
 | 
					    * @var int
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $length;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Array of state objects
 | 
				
			||||||
 | 
					    * @var array
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $State = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_StateParser setting up states
 | 
				
			||||||
 | 
					    * @var XML_HTMLSax3 instance of user front end class
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_StateParser (& $htmlsax) {
 | 
				
			||||||
 | 
					        $this->htmlsax = & $htmlsax;
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_START] =new XML_HTMLSax3_StartingState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_CLOSING_TAG] =new XML_HTMLSax3_ClosingTagState();
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_TAG] =new XML_HTMLSax3_TagState();
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_OPENING_TAG] =new XML_HTMLSax3_OpeningTagState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_PI] =new XML_HTMLSax3_PiState();
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_JASP] =new XML_HTMLSax3_JaspState();
 | 
				
			||||||
 | 
					        $this->State[XML_HTMLSAX3_STATE_ESCAPE] =new XML_HTMLSax3_EscapeState();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Moves the position back one character
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function unscanCharacter() {
 | 
				
			||||||
 | 
					        $this->position -= 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Moves the position forward one character
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function ignoreCharacter() {
 | 
				
			||||||
 | 
					        $this->position += 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns the next character from the XML document or void if at end
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return mixed
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function scanCharacter() {
 | 
				
			||||||
 | 
					        if ($this->position < $this->length) {
 | 
				
			||||||
 | 
					            return $this->rawtext{$this->position++};
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns a string from the current position to the next occurance
 | 
				
			||||||
 | 
					    * of the supplied string
 | 
				
			||||||
 | 
					    * @param string string to search until
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return string
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function scanUntilString($string) {
 | 
				
			||||||
 | 
					        $start = $this->position;
 | 
				
			||||||
 | 
					        $this->position = strpos($this->rawtext, $string, $start);
 | 
				
			||||||
 | 
					        if ($this->position === FALSE) {
 | 
				
			||||||
 | 
					            $this->position = $this->length;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return substr($this->rawtext, $start, $this->position - $start);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns a string from the current position until the first instance of
 | 
				
			||||||
 | 
					    * one of the characters in the supplied string argument
 | 
				
			||||||
 | 
					    * @param string string to search until
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return string
 | 
				
			||||||
 | 
					    * @abstract
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function scanUntilCharacters($string) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Moves the position forward past any whitespace characters
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @abstract
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function ignoreWhitespace() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Begins the parsing operation, setting up any decorators, depending on
 | 
				
			||||||
 | 
					    * parse options invoking _parse() to execute parsing
 | 
				
			||||||
 | 
					    * @param string XML document to parse
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse($data) {
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_TRIM_DATA_NODES']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Trim(
 | 
				
			||||||
 | 
					                $this->handler_object_data,
 | 
				
			||||||
 | 
					                $this->handler_method_data);
 | 
				
			||||||
 | 
					            $this->handler_object_data =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_data = 'trimData';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_CASE_FOLDING']==1) {
 | 
				
			||||||
 | 
					            $open_decor =new XML_HTMLSax3_CaseFolding(
 | 
				
			||||||
 | 
					                $this->handler_object_element,
 | 
				
			||||||
 | 
					                $this->handler_method_opening,
 | 
				
			||||||
 | 
					                $this->handler_method_closing);
 | 
				
			||||||
 | 
					            $this->handler_object_element =& $open_decor;
 | 
				
			||||||
 | 
					            $this->handler_method_opening ='foldOpen';
 | 
				
			||||||
 | 
					            $this->handler_method_closing ='foldClose';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_LINEFEED_BREAK']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Linefeed(
 | 
				
			||||||
 | 
					                $this->handler_object_data,
 | 
				
			||||||
 | 
					                $this->handler_method_data);
 | 
				
			||||||
 | 
					            $this->handler_object_data =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_data = 'breakData';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_TAB_BREAK']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Tab(
 | 
				
			||||||
 | 
					                $this->handler_object_data,
 | 
				
			||||||
 | 
					                $this->handler_method_data);
 | 
				
			||||||
 | 
					            $this->handler_object_data =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_data = 'breakData';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_ENTITIES_UNPARSED']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Entities_Unparsed(
 | 
				
			||||||
 | 
					                $this->handler_object_data,
 | 
				
			||||||
 | 
					                $this->handler_method_data);
 | 
				
			||||||
 | 
					            $this->handler_object_data =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_data = 'breakData';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_ENTITIES_PARSED']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Entities_Parsed(
 | 
				
			||||||
 | 
					                $this->handler_object_data,
 | 
				
			||||||
 | 
					                $this->handler_method_data);
 | 
				
			||||||
 | 
					            $this->handler_object_data =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_data = 'breakData';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Note switched on by default
 | 
				
			||||||
 | 
					        if ($this->parser_options['XML_OPTION_STRIP_ESCAPES']==1) {
 | 
				
			||||||
 | 
					            $decorator =new XML_HTMLSax3_Escape_Stripper(
 | 
				
			||||||
 | 
					                $this->handler_object_escape,
 | 
				
			||||||
 | 
					                $this->handler_method_escape);
 | 
				
			||||||
 | 
					            $this->handler_object_escape =& $decorator;
 | 
				
			||||||
 | 
					            $this->handler_method_escape = 'strip';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $this->rawtext = $data;
 | 
				
			||||||
 | 
					        $this->length = strlen($data);
 | 
				
			||||||
 | 
					        $this->position = 0;
 | 
				
			||||||
 | 
					        $this->_parse();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Performs the parsing itself, delegating calls to a specific parser
 | 
				
			||||||
 | 
					    * state
 | 
				
			||||||
 | 
					    * @param constant state object to parse with
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function _parse($state = XML_HTMLSAX3_STATE_START) {
 | 
				
			||||||
 | 
					        do {
 | 
				
			||||||
 | 
					            $state = $this->State[$state]->parse($this);
 | 
				
			||||||
 | 
					        } while ($state != XML_HTMLSAX3_STATE_STOP &&
 | 
				
			||||||
 | 
					                    $this->position < $this->length);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Parser for PHP Versions below 4.3.0. Uses a slower parsing mechanism than
 | 
				
			||||||
 | 
					* the equivalent PHP 4.3.0+  subclass of StateParser
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					* @see XML_HTMLSax3_StateParser_Gtet430
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_StateParser_Lt430 extends XML_HTMLSax3_StateParser {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_StateParser_Lt430 defining available
 | 
				
			||||||
 | 
					    * parser options
 | 
				
			||||||
 | 
					    * @var XML_HTMLSax3 instance of user front end class
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_StateParser_Lt430(& $htmlsax) {
 | 
				
			||||||
 | 
					        parent::XML_HTMLSax3_StateParser($htmlsax);
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_TAB_BREAK'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns a string from the current position until the first instance of
 | 
				
			||||||
 | 
					    * one of the characters in the supplied string argument
 | 
				
			||||||
 | 
					    * @param string string to search until
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return string
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function scanUntilCharacters($string) {
 | 
				
			||||||
 | 
					        $startpos = $this->position;
 | 
				
			||||||
 | 
					        while ($this->position < $this->length && strpos($string, $this->rawtext{$this->position}) === FALSE) {
 | 
				
			||||||
 | 
					            $this->position++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return substr($this->rawtext, $startpos, $this->position - $startpos);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Moves the position forward past any whitespace characters
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function ignoreWhitespace() {
 | 
				
			||||||
 | 
					        while ($this->position < $this->length && 
 | 
				
			||||||
 | 
					            strpos(" \n\r\t", $this->rawtext{$this->position}) !== FALSE) {
 | 
				
			||||||
 | 
					            $this->position++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Begins the parsing operation, setting up the unparsed XML entities
 | 
				
			||||||
 | 
					    * decorator if necessary then delegating further work to parent
 | 
				
			||||||
 | 
					    * @param string XML document to parse
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse($data) {
 | 
				
			||||||
 | 
					        parent::parse($data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Parser for PHP Versions equal to or greater than 4.3.0. Uses a faster
 | 
				
			||||||
 | 
					* parsing mechanism than the equivalent PHP < 4.3.0 subclass of StateParser
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					* @see XML_HTMLSax3_StateParser_Lt430
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_StateParser_Gtet430 extends XML_HTMLSax3_StateParser {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_StateParser_Gtet430 defining available
 | 
				
			||||||
 | 
					    * parser options
 | 
				
			||||||
 | 
					    * @var XML_HTMLSax3 instance of user front end class
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_StateParser_Gtet430(& $htmlsax) {
 | 
				
			||||||
 | 
					        parent::XML_HTMLSax3_StateParser($htmlsax);
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_TRIM_DATA_NODES'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_CASE_FOLDING'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_LINEFEED_BREAK'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_TAB_BREAK'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_ENTITIES_PARSED'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_ENTITIES_UNPARSED'] = 0;
 | 
				
			||||||
 | 
					        $this->parser_options['XML_OPTION_STRIP_ESCAPES'] = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns a string from the current position until the first instance of
 | 
				
			||||||
 | 
					    * one of the characters in the supplied string argument.
 | 
				
			||||||
 | 
					    * @param string string to search until
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return string
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function scanUntilCharacters($string) {
 | 
				
			||||||
 | 
					        $startpos = $this->position;
 | 
				
			||||||
 | 
					        $length = strcspn($this->rawtext, $string, $startpos);
 | 
				
			||||||
 | 
					        $this->position += $length;
 | 
				
			||||||
 | 
					        return substr($this->rawtext, $startpos, $length);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Moves the position forward past any whitespace characters
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function ignoreWhitespace() {
 | 
				
			||||||
 | 
					        $this->position += strspn($this->rawtext, " \n\r\t", $this->position);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Begins the parsing operation, setting up the parsed and unparsed
 | 
				
			||||||
 | 
					    * XML entity decorators if necessary then delegating further work
 | 
				
			||||||
 | 
					    * to parent
 | 
				
			||||||
 | 
					    * @param string XML document to parse
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse($data) {
 | 
				
			||||||
 | 
					        parent::parse($data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Default NullHandler for methods which were not set by user
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_NullHandler {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Generic handler method which does nothing
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function DoNothing() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* User interface class. All user calls should only be made to this class
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access public
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3 {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Instance of concrete subclass of XML_HTMLSax3_StateParser
 | 
				
			||||||
 | 
					    * @var XML_HTMLSax3_StateParser
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $state_parser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3 selecting concrete StateParser subclass
 | 
				
			||||||
 | 
					    * depending on PHP version being used as well as setting the default
 | 
				
			||||||
 | 
					    * NullHandler for all callbacks<br />
 | 
				
			||||||
 | 
					    * <b>Example:</b>
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * $myHandler = new MyHandler();
 | 
				
			||||||
 | 
					    * $parser = new XML_HTMLSax3();
 | 
				
			||||||
 | 
					    * $parser->set_object($myHandler);
 | 
				
			||||||
 | 
					    * $parser->set_option('XML_OPTION_CASE_FOLDING');
 | 
				
			||||||
 | 
					    * $parser->set_element_handler('myOpenHandler','myCloseHandler');
 | 
				
			||||||
 | 
					    * $parser->set_data_handler('myDataHandler');
 | 
				
			||||||
 | 
					    * $parser->parser($xml);
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3() {
 | 
				
			||||||
 | 
					        if (version_compare(phpversion(), '4.3', 'ge')) {
 | 
				
			||||||
 | 
					            $this->state_parser =new XML_HTMLSax3_StateParser_Gtet430($this);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            $this->state_parser =new XML_HTMLSax3_StateParser_Lt430($this);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $nullhandler =new XML_HTMLSax3_NullHandler();
 | 
				
			||||||
 | 
					        $this->set_object($nullhandler);
 | 
				
			||||||
 | 
					        $this->set_element_handler('DoNothing', 'DoNothing');
 | 
				
			||||||
 | 
					        $this->set_data_handler('DoNothing');
 | 
				
			||||||
 | 
					        $this->set_pi_handler('DoNothing');
 | 
				
			||||||
 | 
					        $this->set_jasp_handler('DoNothing');
 | 
				
			||||||
 | 
					        $this->set_escape_handler('DoNothing');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the user defined handler object. Returns a PEAR Error
 | 
				
			||||||
 | 
					    * if supplied argument is not an object.
 | 
				
			||||||
 | 
					    * @param object handler object containing SAX callback methods
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return mixed
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_object(&$object) {
 | 
				
			||||||
 | 
					        if ( is_object($object) ) {
 | 
				
			||||||
 | 
					            $this->state_parser->handler_default =& $object;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            require_once('PEAR.php');
 | 
				
			||||||
 | 
					            PEAR::raiseError('XML_HTMLSax3::set_object requires '.
 | 
				
			||||||
 | 
					                'an object instance');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets a parser option. By default all options are switched off.
 | 
				
			||||||
 | 
					    * Returns a PEAR Error if option is invalid<br />
 | 
				
			||||||
 | 
					    * <b>Available options:</b>
 | 
				
			||||||
 | 
					    * <ul>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_TRIM_DATA_NODES: trim whitespace off the beginning
 | 
				
			||||||
 | 
					    * and end of data passed to the data handler</li>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_LINEFEED_BREAK: linefeeds result in additional data
 | 
				
			||||||
 | 
					    * handler calls</li>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_TAB_BREAK: tabs result in additional data handler
 | 
				
			||||||
 | 
					    * calls</li>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_ENTITIES_UNPARSED: XML entities are returned as
 | 
				
			||||||
 | 
					    * seperate data handler calls in unparsed form</li>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_ENTITIES_PARSED: (PHP 4.3.0+ only) XML entities are
 | 
				
			||||||
 | 
					    * returned as seperate data handler calls and are parsed with 
 | 
				
			||||||
 | 
					    * PHP's html_entity_decode() function</li>
 | 
				
			||||||
 | 
					    * <li>XML_OPTION_STRIP_ESCAPES: strips out the -- -- comment markers
 | 
				
			||||||
 | 
					    * or CDATA markup inside an XML escape, if found.</li>
 | 
				
			||||||
 | 
					    * </ul>
 | 
				
			||||||
 | 
					    * To get HTMLSax to behave in the same way as the native PHP SAX parser,
 | 
				
			||||||
 | 
					    * using it's default state, you need to switch on XML_OPTION_LINEFEED_BREAK,
 | 
				
			||||||
 | 
					    * XML_OPTION_ENTITIES_PARSED and XML_OPTION_CASE_FOLDING
 | 
				
			||||||
 | 
					    * @param string name of parser option
 | 
				
			||||||
 | 
					    * @param int (optional) 1 to switch on, 0 for off
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return boolean
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_option($name, $value=1) {
 | 
				
			||||||
 | 
					        if ( array_key_exists($name,$this->state_parser->parser_options) ) {
 | 
				
			||||||
 | 
					            $this->state_parser->parser_options[$name] = $value;
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            require_once('PEAR.php');
 | 
				
			||||||
 | 
					            PEAR::raiseError('XML_HTMLSax3::set_option('.$name.') illegal');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the data handler method which deals with the contents of XML
 | 
				
			||||||
 | 
					    * elements.<br />
 | 
				
			||||||
 | 
					    * The handler method must accept two arguments, the first being an
 | 
				
			||||||
 | 
					    * instance of XML_HTMLSax3 and the second being the contents of an
 | 
				
			||||||
 | 
					    * XML element e.g.
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myDataHander(& $parser,$data){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @param string name of method
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @see set_object
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_data_handler($data_method) {
 | 
				
			||||||
 | 
					        $this->state_parser->handler_object_data =& $this->state_parser->handler_default;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_data = $data_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the open and close tag handlers
 | 
				
			||||||
 | 
					    * <br />The open handler method must accept three arguments; the parser,
 | 
				
			||||||
 | 
					    * the tag name and an array of attributes e.g.
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myOpenHander(& $parser,$tagname,$attrs=array()){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * The close handler method must accept two arguments; the parser and
 | 
				
			||||||
 | 
					    * the tag name e.g.
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myCloseHander(& $parser,$tagname){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @param string name of open method
 | 
				
			||||||
 | 
					    * @param string name of close method
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @see set_object
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_element_handler($opening_method, $closing_method) {
 | 
				
			||||||
 | 
					        $this->state_parser->handler_object_element =& $this->state_parser->handler_default;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_opening = $opening_method;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_closing = $closing_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the processing instruction handler method e.g. for PHP open
 | 
				
			||||||
 | 
					    * and close tags<br />
 | 
				
			||||||
 | 
					    * The handler method must accept three arguments; the parser, the
 | 
				
			||||||
 | 
					    * PI target and data inside the PI
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myPIHander(& $parser,$target, $data){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @param string name of method
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @see set_object
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_pi_handler($pi_method) {
 | 
				
			||||||
 | 
					        $this->state_parser->handler_object_pi =& $this->state_parser->handler_default;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_pi = $pi_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the XML escape handler method e.g. for comments and doctype
 | 
				
			||||||
 | 
					    * declarations<br />
 | 
				
			||||||
 | 
					    * The handler method must accept two arguments; the parser and the
 | 
				
			||||||
 | 
					    * contents of the escaped section
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myEscapeHander(& $parser, $data){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @param string name of method
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @see set_object
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_escape_handler($escape_method) {
 | 
				
			||||||
 | 
					        $this->state_parser->handler_object_escape =& $this->state_parser->handler_default;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_escape = $escape_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Sets the JSP/ASP markup handler<br />
 | 
				
			||||||
 | 
					    * The handler method must accept two arguments; the parser and
 | 
				
			||||||
 | 
					    * body of the JASP tag
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myJaspHander(& $parser, $data){}
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @param string name of method
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @see set_object
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function set_jasp_handler ($jasp_method) {
 | 
				
			||||||
 | 
					        $this->state_parser->handler_object_jasp =& $this->state_parser->handler_default;
 | 
				
			||||||
 | 
					        $this->state_parser->handler_method_jasp = $jasp_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns the current string position of the "cursor" inside the XML
 | 
				
			||||||
 | 
					    * document
 | 
				
			||||||
 | 
					    * <br />Intended for use from within a user defined handler called
 | 
				
			||||||
 | 
					    * via the $parser reference e.g.
 | 
				
			||||||
 | 
					    * <pre>
 | 
				
			||||||
 | 
					    * function myDataHandler(& $parser,$data) {
 | 
				
			||||||
 | 
					    *     echo( 'Current position: '.$parser->get_current_position() );
 | 
				
			||||||
 | 
					    * }
 | 
				
			||||||
 | 
					    * </pre>
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return int
 | 
				
			||||||
 | 
					    * @see get_length
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function get_current_position() {
 | 
				
			||||||
 | 
					        return $this->state_parser->position;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Returns the string length of the XML document being parsed
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return int
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function get_length() {
 | 
				
			||||||
 | 
					        return $this->state_parser->length;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Start parsing some XML
 | 
				
			||||||
 | 
					    * @param string XML document
 | 
				
			||||||
 | 
					    * @access public
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse($data) {
 | 
				
			||||||
 | 
					        $this->state_parser->parse($data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										363
									
								
								engine/lib/XML/HTMLSax3/Decorators.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								engine/lib/XML/HTMLSax3/Decorators.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,363 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/* vim: set expandtab tabstop=4 shiftwidth=4: */
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | PHP Version 4                                                        |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Copyright (c) 1997-2002 The PHP Group                                |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | This source file is subject toversion 3.0 of the PHP license,      |
 | 
				
			||||||
 | 
					// | that is bundled with this package in the file LICENSE, and is        |
 | 
				
			||||||
 | 
					// | available at through the world-wide-web at                           |
 | 
				
			||||||
 | 
					// | http://www.php.net/license/3_0.txt.                                  |
 | 
				
			||||||
 | 
					// | If you did not receive a copy of the PHP license and are unable to   |
 | 
				
			||||||
 | 
					// | obtain it through the world-wide-web, please send a note to          |
 | 
				
			||||||
 | 
					// | license@php.net so we can mail you a copy immediately.               |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
 | 
				
			||||||
 | 
					// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more  |
 | 
				
			||||||
 | 
					// | Authors: Many @ Sitepointforums Advanced PHP Forums                  |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// $Id: Decorators.php,v 1.2 2007/10/29 21:41:35 hfuecks Exp $
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Decorators for dealing with parser options
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @version $Id: Decorators.php,v 1.2 2007/10/29 21:41:35 hfuecks Exp $
 | 
				
			||||||
 | 
					* @see XML_HTMLSax3::set_option
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Trims the contents of element data from whitespace at start and end
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Trim {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_Trim
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_Trim(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Trims the data
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function trimData(&$parser, $data) {
 | 
				
			||||||
 | 
					        $data = trim($data);
 | 
				
			||||||
 | 
					        if ($data != '') {
 | 
				
			||||||
 | 
					            $this->orig_obj->{$this->orig_method}($parser, $data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Coverts tag names to upper case
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_CaseFolding {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original open handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_open_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original close handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_close_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_CaseFolding
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original open handler method
 | 
				
			||||||
 | 
					    * @param string original close handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_CaseFolding(&$orig_obj, $orig_open_method, $orig_close_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_open_method = $orig_open_method;
 | 
				
			||||||
 | 
					        $this->orig_close_method = $orig_close_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Folds up open tag callbacks
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string tag name
 | 
				
			||||||
 | 
					    * @param array tag attributes
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function foldOpen(&$parser, $tag, $attrs=array(), $empty = FALSE) {
 | 
				
			||||||
 | 
					        $this->orig_obj->{$this->orig_open_method}($parser, strtoupper($tag), $attrs, $empty);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Folds up close tag callbacks
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string tag name
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function foldClose(&$parser, $tag, $empty = FALSE) {
 | 
				
			||||||
 | 
					        $this->orig_obj->{$this->orig_close_method}($parser, strtoupper($tag), $empty);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Breaks up data by linefeed characters, resulting in additional
 | 
				
			||||||
 | 
					* calls to the data handler
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Linefeed {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_LineFeed
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_LineFeed(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Breaks the data up by linefeeds
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function breakData(&$parser, $data) {
 | 
				
			||||||
 | 
					        $data = explode("\n",$data);
 | 
				
			||||||
 | 
					        foreach ( $data as $chunk ) {
 | 
				
			||||||
 | 
					            $this->orig_obj->{$this->orig_method}($parser, $chunk);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Breaks up data by tab characters, resulting in additional
 | 
				
			||||||
 | 
					* calls to the data handler
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Tab {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_Tab
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_Tab(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Breaks the data up by linefeeds
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function breakData(&$parser, $data) {
 | 
				
			||||||
 | 
					        $data = explode("\t",$data);
 | 
				
			||||||
 | 
					        foreach ( $data as $chunk ) {
 | 
				
			||||||
 | 
					            $this->orig_obj->{$this->orig_method}($this, $chunk);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Breaks up data by XML entities and parses them with html_entity_decode(),
 | 
				
			||||||
 | 
					* resulting in additional calls to the data handler<br />
 | 
				
			||||||
 | 
					* Requires PHP 4.3.0+
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Entities_Parsed {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_Entities_Parsed
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_Entities_Parsed(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Breaks the data up by XML entities
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function breakData(&$parser, $data) {
 | 
				
			||||||
 | 
					        $data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
 | 
				
			||||||
 | 
					        foreach ( $data as $chunk ) {
 | 
				
			||||||
 | 
					            $chunk = html_entity_decode($chunk,ENT_NOQUOTES);
 | 
				
			||||||
 | 
					            $this->orig_obj->{$this->orig_method}($this, $chunk);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Compatibility with older PHP versions
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					if (version_compare(phpversion(), '4.3', '<') && !function_exists('html_entity_decode') ) {
 | 
				
			||||||
 | 
					    function html_entity_decode($str, $style=ENT_NOQUOTES) {
 | 
				
			||||||
 | 
					        return strtr($str,
 | 
				
			||||||
 | 
					            array_flip(get_html_translation_table(HTML_ENTITIES,$style)));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Breaks up data by XML entities but leaves them unparsed,
 | 
				
			||||||
 | 
					* resulting in additional calls to the data handler<br />
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Entities_Unparsed {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_Entities_Unparsed
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_Entities_Unparsed(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Breaks the data up by XML entities
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function breakData(&$parser, $data) {
 | 
				
			||||||
 | 
					        $data = preg_split('/(&.+?;)/',$data,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
 | 
				
			||||||
 | 
					        foreach ( $data as $chunk ) {
 | 
				
			||||||
 | 
					            $this->orig_obj->{$this->orig_method}($this, $chunk);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Strips the HTML comment markers or CDATA sections from an escape.
 | 
				
			||||||
 | 
					* If XML_OPTIONS_FULL_ESCAPES is on, this decorator is not used.<br />
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_Escape_Stripper {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler object
 | 
				
			||||||
 | 
					    * @var object
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_obj;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Original handler method
 | 
				
			||||||
 | 
					    * @var string
 | 
				
			||||||
 | 
					    * @access private
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    var $orig_method;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Constructs XML_HTMLSax3_Entities_Unparsed
 | 
				
			||||||
 | 
					    * @param object handler object being decorated
 | 
				
			||||||
 | 
					    * @param string original handler method
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function XML_HTMLSax3_Escape_Stripper(&$orig_obj, $orig_method) {
 | 
				
			||||||
 | 
					        $this->orig_obj =& $orig_obj;
 | 
				
			||||||
 | 
					        $this->orig_method = $orig_method;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Breaks the data up by XML entities
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3
 | 
				
			||||||
 | 
					    * @param string element data
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function strip(&$parser, $data) {
 | 
				
			||||||
 | 
					        // Check for HTML comments first
 | 
				
			||||||
 | 
					        if ( substr($data,0,2) == '--' ) {
 | 
				
			||||||
 | 
					            $patterns = array(
 | 
				
			||||||
 | 
					                '/^\-\-/',          // Opening comment: --
 | 
				
			||||||
 | 
					                '/\-\-$/',          // Closing comment: --
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            $data = preg_replace($patterns,'',$data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Check for XML CDATA sections (note: don't do both!)
 | 
				
			||||||
 | 
					        } else if ( substr($data,0,1) == '[' ) {
 | 
				
			||||||
 | 
					            $patterns = array(
 | 
				
			||||||
 | 
					                '/^\[.*CDATA.*\[/s', // Opening CDATA
 | 
				
			||||||
 | 
					                '/\].*\]$/s',       // Closing CDATA
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            $data = preg_replace($patterns,'',$data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->orig_obj->{$this->orig_method}($this, $data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										287
									
								
								engine/lib/XML/HTMLSax3/States.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										287
									
								
								engine/lib/XML/HTMLSax3/States.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,287 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/* vim: set expandtab tabstop=4 shiftwidth=4: */
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | PHP Version 4                                                        |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Copyright (c) 1997-2002 The PHP Group                                |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | This source file is subject toversion 3.0 of the PHP license,      |
 | 
				
			||||||
 | 
					// | that is bundled with this package in the file LICENSE, and is        |
 | 
				
			||||||
 | 
					// | available at through the world-wide-web at                           |
 | 
				
			||||||
 | 
					// | http://www.php.net/license/3_0.txt.                                  |
 | 
				
			||||||
 | 
					// | If you did not receive a copy of the PHP license and are unable to   |
 | 
				
			||||||
 | 
					// | obtain it through the world-wide-web, please send a note to          |
 | 
				
			||||||
 | 
					// | license@php.net so we can mail you a copy immediately.               |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					// | Authors: Alexander Zhukov <alex@veresk.ru> Original port from Python |
 | 
				
			||||||
 | 
					// | Authors: Harry Fuecks <hfuecks@phppatterns.com> Port to PEAR + more  |
 | 
				
			||||||
 | 
					// | Authors: Many @ Sitepointforums Advanced PHP Forums                  |
 | 
				
			||||||
 | 
					// +----------------------------------------------------------------------+
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// $Id: States.php,v 1.3 2007/10/29 21:41:35 hfuecks Exp $
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Parsing states.
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @version $Id: States.php,v 1.3 2007/10/29 21:41:35 hfuecks Exp $
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Define parser states
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_STOP', 0);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_START', 1);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_TAG', 2);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_OPENING_TAG', 3);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_CLOSING_TAG', 4);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_ESCAPE', 6);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_JASP', 7);
 | 
				
			||||||
 | 
					define('XML_HTMLSAX3_STATE_PI', 8);
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* StartingState searches for the start of any XML tag
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_StartingState  {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_TAG
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $data = $context->scanUntilString('<');
 | 
				
			||||||
 | 
					        if ($data != '') {
 | 
				
			||||||
 | 
					            $context->handler_object_data->
 | 
				
			||||||
 | 
					                {$context->handler_method_data}($context->htmlsax, $data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_TAG;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Decides which state to move one from after StartingState
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_TagState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant the next state to move into
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        switch($context->ScanCharacter()) {
 | 
				
			||||||
 | 
					        case '/':
 | 
				
			||||||
 | 
					            return XML_HTMLSAX3_STATE_CLOSING_TAG;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case '?':
 | 
				
			||||||
 | 
					            return XML_HTMLSAX3_STATE_PI;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case '%':
 | 
				
			||||||
 | 
					            return XML_HTMLSAX3_STATE_JASP;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case '!':
 | 
				
			||||||
 | 
					            return XML_HTMLSAX3_STATE_ESCAPE;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            $context->unscanCharacter();
 | 
				
			||||||
 | 
					            return XML_HTMLSAX3_STATE_OPENING_TAG;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Dealing with closing XML tags
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_ClosingTagState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_START
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $tag = $context->scanUntilCharacters('/>');
 | 
				
			||||||
 | 
					        if ($tag != '') {
 | 
				
			||||||
 | 
					            $char = $context->scanCharacter();
 | 
				
			||||||
 | 
					            if ($char == '/') {
 | 
				
			||||||
 | 
					                $char = $context->scanCharacter();
 | 
				
			||||||
 | 
					                if ($char != '>') {
 | 
				
			||||||
 | 
					                    $context->unscanCharacter();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            $context->handler_object_element->
 | 
				
			||||||
 | 
					                {$context->handler_method_closing}($context->htmlsax, $tag, FALSE);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_START;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Dealing with opening XML tags
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_OpeningTagState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Handles attributes
 | 
				
			||||||
 | 
					    * @param string attribute name
 | 
				
			||||||
 | 
					    * @param string attribute value
 | 
				
			||||||
 | 
					    * @return void
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    * @see XML_HTMLSax3_AttributeStartState
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parseAttributes(&$context) {
 | 
				
			||||||
 | 
					        $Attributes = array();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					        $context->ignoreWhitespace();
 | 
				
			||||||
 | 
					        $attributename = $context->scanUntilCharacters("=/> \n\r\t");
 | 
				
			||||||
 | 
					        while ($attributename != '') {
 | 
				
			||||||
 | 
					            $attributevalue = NULL;
 | 
				
			||||||
 | 
					            $context->ignoreWhitespace();
 | 
				
			||||||
 | 
					            $char = $context->scanCharacter();
 | 
				
			||||||
 | 
					            if ($char == '=') {
 | 
				
			||||||
 | 
					                $context->ignoreWhitespace();
 | 
				
			||||||
 | 
					                $char = $context->ScanCharacter();
 | 
				
			||||||
 | 
					                if ($char == '"') {
 | 
				
			||||||
 | 
					                    $attributevalue= $context->scanUntilString('"');
 | 
				
			||||||
 | 
					                    $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					                } else if ($char == "'") {
 | 
				
			||||||
 | 
					                    $attributevalue = $context->scanUntilString("'");
 | 
				
			||||||
 | 
					                    $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    $context->unscanCharacter();
 | 
				
			||||||
 | 
					                    $attributevalue =
 | 
				
			||||||
 | 
					                        $context->scanUntilCharacters("> \n\r\t");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else if ($char !== NULL) {
 | 
				
			||||||
 | 
					                $attributevalue = NULL;
 | 
				
			||||||
 | 
					                $context->unscanCharacter();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            $Attributes[$attributename] = $attributevalue;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            $context->ignoreWhitespace();
 | 
				
			||||||
 | 
					            $attributename = $context->scanUntilCharacters("=/> \n\r\t");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return $Attributes;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_START
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $tag = $context->scanUntilCharacters("/> \n\r\t");
 | 
				
			||||||
 | 
					        if ($tag != '') {
 | 
				
			||||||
 | 
					            $this->attrs = array();
 | 
				
			||||||
 | 
					            $Attributes = $this->parseAttributes($context);
 | 
				
			||||||
 | 
					            $char = $context->scanCharacter();
 | 
				
			||||||
 | 
					            if ($char == '/') {
 | 
				
			||||||
 | 
					                $char = $context->scanCharacter();
 | 
				
			||||||
 | 
					                if ($char != '>') {
 | 
				
			||||||
 | 
					                    $context->unscanCharacter();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                $context->handler_object_element->
 | 
				
			||||||
 | 
					                    {$context->handler_method_opening}($context->htmlsax, $tag, 
 | 
				
			||||||
 | 
					                    $Attributes, TRUE);
 | 
				
			||||||
 | 
					                $context->handler_object_element->
 | 
				
			||||||
 | 
					                    {$context->handler_method_closing}($context->htmlsax, $tag, 
 | 
				
			||||||
 | 
					                    TRUE);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                $context->handler_object_element->
 | 
				
			||||||
 | 
					                    {$context->handler_method_opening}($context->htmlsax, $tag, 
 | 
				
			||||||
 | 
					                    $Attributes, FALSE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_START;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Deals with XML escapes handling comments and CDATA correctly
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_EscapeState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_START
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $char = $context->ScanCharacter();
 | 
				
			||||||
 | 
					        if ($char == '-') {
 | 
				
			||||||
 | 
					            $char = $context->ScanCharacter();
 | 
				
			||||||
 | 
					            if ($char == '-') {
 | 
				
			||||||
 | 
					                $context->unscanCharacter();
 | 
				
			||||||
 | 
					                $context->unscanCharacter();
 | 
				
			||||||
 | 
					                $text = $context->scanUntilString('-->');
 | 
				
			||||||
 | 
					                $text .= $context->scanCharacter();
 | 
				
			||||||
 | 
					                $text .= $context->scanCharacter();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                $context->unscanCharacter();
 | 
				
			||||||
 | 
					                $text = $context->scanUntilString('>');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else if ( $char == '[') {
 | 
				
			||||||
 | 
					            $context->unscanCharacter();
 | 
				
			||||||
 | 
					            $text = $context->scanUntilString(']>');
 | 
				
			||||||
 | 
					            $text.= $context->scanCharacter();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            $context->unscanCharacter();
 | 
				
			||||||
 | 
					            $text = $context->scanUntilString('>');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        if ($text != '') {
 | 
				
			||||||
 | 
					            $context->handler_object_escape->
 | 
				
			||||||
 | 
					            {$context->handler_method_escape}($context->htmlsax, $text);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_START;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Deals with JASP/ASP markup
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_JaspState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_START
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $text = $context->scanUntilString('%>');
 | 
				
			||||||
 | 
					        if ($text != '') {
 | 
				
			||||||
 | 
					            $context->handler_object_jasp->
 | 
				
			||||||
 | 
					                {$context->handler_method_jasp}($context->htmlsax, $text);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_START;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* Deals with XML processing instructions
 | 
				
			||||||
 | 
					* @package XML_HTMLSax3
 | 
				
			||||||
 | 
					* @access protected
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					class XML_HTMLSax3_PiState {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * @param XML_HTMLSax3_StateParser subclass
 | 
				
			||||||
 | 
					    * @return constant XML_HTMLSAX3_STATE_START
 | 
				
			||||||
 | 
					    * @access protected
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    function parse(&$context) {
 | 
				
			||||||
 | 
					        $target = $context->scanUntilCharacters(" \n\r\t");
 | 
				
			||||||
 | 
					        $data = $context->scanUntilString('?>');
 | 
				
			||||||
 | 
					        if ($data != '') {
 | 
				
			||||||
 | 
					            $context->handler_object_pi->
 | 
				
			||||||
 | 
					            {$context->handler_method_pi}($context->htmlsax, $target, $data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        $context->IgnoreCharacter();
 | 
				
			||||||
 | 
					        return XML_HTMLSAX3_STATE_START;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										140
									
								
								engine/lib/core.function.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										140
									
								
								engine/lib/core.function.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,140 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/*文件扩展名说明 
 | 
				
			||||||
 | 
					*7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.doc.ppt *6063 xml *6033 htm,html *4742 js 
 | 
				
			||||||
 | 
					*8075 xlsx,zip,pptx,mmap,zip *8297 rar *01 accdb,mdb *7790 exe,dll *5666 psd *255254 rdp *10056 bt种子 *64101 bat 
 | 
				
			||||||
 | 
					*/ 
 | 
				
			||||||
 | 
					function getFileType( $file ){
 | 
				
			||||||
 | 
						$fp = fopen($file, "rb");
 | 
				
			||||||
 | 
						$bin = fread($fp, 2); //只读2字节
 | 
				
			||||||
 | 
						fclose($fp);
 | 
				
			||||||
 | 
						$str_info = @unpack("C2chars", $bin);
 | 
				
			||||||
 | 
						$type_code = intval($str_info['chars1'].$str_info['chars2']);
 | 
				
			||||||
 | 
						$file_type = '';
 | 
				
			||||||
 | 
						switch ($type_code) {
 | 
				
			||||||
 | 
							case 239187:
 | 
				
			||||||
 | 
								$file_type = 'txt';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 7784:
 | 
				
			||||||
 | 
								$file_type = 'midi';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 8075:
 | 
				
			||||||
 | 
								$file_type = 'zip';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 8297:
 | 
				
			||||||
 | 
								$file_type = 'rar';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 255216:
 | 
				
			||||||
 | 
								$file_type = 'jpg';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 7173:
 | 
				
			||||||
 | 
								$file_type = 'gif';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 6677:
 | 
				
			||||||
 | 
								$file_type = 'bmp';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 13780:
 | 
				
			||||||
 | 
								$file_type = 'png';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								$file_type = 'unknown';
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return $file_type;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function isAjax(){
 | 
				
			||||||
 | 
						if( isset( $GLOBALS['__isAjax'] ) ){
 | 
				
			||||||
 | 
							return $GLOBALS['__isAjax'];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$headers = apache_request_headers();
 | 
				
			||||||
 | 
						$GLOBALS['__isAjax'] = (isset( $headers['X-Requested-With'] ) && ( $headers['X-Requested-With'] == 'XMLHttpRequest' )) || (isset( $headers['x-requested-with'] ) && ($headers['x-requested-with'] == 'XMLHttpRequest' ));
 | 
				
			||||||
 | 
						return $GLOBALS['__isAjax'];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function c( $name ){ 
 | 
				
			||||||
 | 
						if( !isset( $GLOBALS['__config'] ) ){
 | 
				
			||||||
 | 
								$__config = NULL;
 | 
				
			||||||
 | 
								include( ENGINE.'config/core.config.php' );
 | 
				
			||||||
 | 
								include( ROOT.'config/app.config.php' );
 | 
				
			||||||
 | 
								$GLOBALS['__config'] = $__config;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( isset( $GLOBALS['__config'][$name] ) ){
 | 
				
			||||||
 | 
							return $GLOBALS['__config'][$name];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}	
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function db(){
 | 
				
			||||||
 | 
						if( !$GLOBALS['__db'] ){
 | 
				
			||||||
 | 
							$GLOBALS['__db'] = new Db();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return $GLOBALS['__db'];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function get_ip() {
 | 
				
			||||||
 | 
					   if (isSet($_SERVER)) {
 | 
				
			||||||
 | 
					       if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"])) {
 | 
				
			||||||
 | 
					           $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
 | 
				
			||||||
 | 
					       } elseif (isSet($_SERVER["HTTP_CLIENT_IP"])) {
 | 
				
			||||||
 | 
					               $realip = $_SERVER["HTTP_CLIENT_IP"];
 | 
				
			||||||
 | 
					           } else {
 | 
				
			||||||
 | 
					               $realip = $_SERVER["REMOTE_ADDR"];
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					       } else {
 | 
				
			||||||
 | 
					           if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
 | 
				
			||||||
 | 
					               $realip = getenv( 'HTTP_X_FORWARDED_FOR' );
 | 
				
			||||||
 | 
					           } elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
 | 
				
			||||||
 | 
					               $realip = getenv( 'HTTP_CLIENT_IP' );
 | 
				
			||||||
 | 
					           } else {
 | 
				
			||||||
 | 
					               $realip = getenv( 'REMOTE_ADDR' );
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   return current( explode(',' , $realip ) ); 
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function v( $str ){
 | 
				
			||||||
 | 
						return getDataFromArray( $str , $_REQUEST );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function p( $str ){
 | 
				
			||||||
 | 
						return getDataFromArray( $str , $_POST );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function getDataFromArray( $array , $data ){
 | 
				
			||||||
 | 
						if( is_array( $array ) ){
 | 
				
			||||||
 | 
							$return = array();
 | 
				
			||||||
 | 
							foreach( $array as $v ){
 | 
				
			||||||
 | 
								if( isset( $data[$v] ) && $data[$v] !== '' ){
 | 
				
			||||||
 | 
									$return[trim($v)] = $data[$v];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return isset( $data[$array] )?$data[$array]:false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function render( $data , $__showPage = NULL , $layout = NULL , $layoutTpl = true ){
 | 
				
			||||||
 | 
						 $__showPage = strtolower( $__showPage);
 | 
				
			||||||
 | 
						if( $layout == NULL ){
 | 
				
			||||||
 | 
							$layout = 'default';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( isAjax() ){
 | 
				
			||||||
 | 
							$requiteFile =  ROOT.'themes/'.$layout.'/ajax/'.$__showPage.'.tpl.html';
 | 
				
			||||||
 | 
						}else{
 | 
				
			||||||
 | 
							$requiteFile =  ROOT.'themes/'.$layout.'/'.($layoutTpl?'layout':$__showPage).'.tpl.html';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( !is_file( $requiteFile ) ){
 | 
				
			||||||
 | 
							die('can\'t load themes '.$__showPage.' files ');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						@extract( $data );
 | 
				
			||||||
 | 
						require( $requiteFile );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if(!function_exists('apache_request_headers')) {     
 | 
				
			||||||
 | 
					    function apache_request_headers(){ 
 | 
				
			||||||
 | 
					        foreach($_SERVER as $key=>$value){
 | 
				
			||||||
 | 
					            if (substr($key,0,5)=="HTTP_") {
 | 
				
			||||||
 | 
					                $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5))))); 
 | 
				
			||||||
 | 
					                $out[$key]=$value;
 | 
				
			||||||
 | 
					            } 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return $out; 
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function safeUrlString( $str ){
 | 
				
			||||||
 | 
						$str = urldecode($str);
 | 
				
			||||||
 | 
						return str_replace( array( '.' , '/' ) , array() , $str  );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								index.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					define( 'IN' , true );
 | 
				
			||||||
 | 
					define( 'ROOT' , dirname( __FILE__ ) . '/' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
 | 
				
			||||||
 | 
					error_reporting( E_ALL^E_NOTICE );
 | 
				
			||||||
 | 
					include_once( ROOT . 'engine/init.inc.php' );
 | 
				
			||||||
 | 
					session_cache_limiter('private, must-revalidate');
 | 
				
			||||||
 | 
					session_set_cookie_params( 60*60*24*1  ); //1day
 | 
				
			||||||
 | 
					session_start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if( !isAjax() ){
 | 
				
			||||||
 | 
						header("content-Type: text/html; charset=Utf-8");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$class = safeUrlString($_REQUEST['c']?:c('default_class'));
 | 
				
			||||||
 | 
					$method = $_REQUEST['m']?:c('default_method');
 | 
				
			||||||
 | 
					$controllersFile = ROOT.'controllers/'.$class.'.class.php';
 | 
				
			||||||
 | 
					if( !is_file( $controllersFile ) ){
 | 
				
			||||||
 | 
						die( "can't find controller file " );
 | 
				
			||||||
 | 
					}else{
 | 
				
			||||||
 | 
						include_once( $controllersFile );
 | 
				
			||||||
 | 
						if( !class_exists(  $class ) ) die('Error Can\'t find class' );
 | 
				
			||||||
 | 
						if( !method_exists( $class , $method  ) ) die('Error Can\'t find method ' );
 | 
				
			||||||
 | 
						$class = new $class;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//print_r( $_SERVER );
 | 
				
			||||||
 | 
					call_user_func(array($class, $method ));
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
							
								
								
									
										750
									
								
								js/core.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										750
									
								
								js/core.js
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,750 @@
 | 
				
			|||||||
 | 
					var TEMP = {};
 | 
				
			||||||
 | 
					TEMP.MESSAGE = '<div class="FB_boxBg"><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td><div class="content okBg">{message}</div></td></tr></tbody></table></div>';
 | 
				
			||||||
 | 
					//normal function for apps 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function afterAjax(res) {
 | 
				
			||||||
 | 
						var error = false;
 | 
				
			||||||
 | 
						var showAjaxMessage = function(res) {
 | 
				
			||||||
 | 
								res = res.replace(/<message type="([\s\S]+?)">([\s\S]+?)<\/message>/, function(message) {
 | 
				
			||||||
 | 
									if (showMessage && arguments.length > 2) {
 | 
				
			||||||
 | 
										if (arguments[1] == 'error') {
 | 
				
			||||||
 | 
											error = true;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										showMessage(arguments[2], arguments[1]);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return '';
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								return res;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						if (typeof(res) == 'string' && res) {
 | 
				
			||||||
 | 
							res = showAjaxMessage(res);
 | 
				
			||||||
 | 
						} else if (typeof(res) == 'object' && typeof(res.message) == 'string' && res.message) {
 | 
				
			||||||
 | 
							showAjaxMessage(res.message);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (error) {
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return res;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function showMessage(message) {
 | 
				
			||||||
 | 
						var res = {};
 | 
				
			||||||
 | 
						res.message = message;
 | 
				
			||||||
 | 
						if (arguments.length >= 2) {
 | 
				
			||||||
 | 
							res.type = arguments[1];
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							res.type = 'notice';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						res = $(res).substitute(TEMP.MESSAGE);
 | 
				
			||||||
 | 
						if ($('#js_message').length > 0 && $('#js_message').get(0).messageAuto) {
 | 
				
			||||||
 | 
							clearTimeout($('#js_message').get(0).messageAuto);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var messageBox = popBox(res, 'js_message', 999);
 | 
				
			||||||
 | 
						$('#js_message').css('z-index', 999);
 | 
				
			||||||
 | 
						$('#js_message').get(0).messageAuto = setTimeout(function() {
 | 
				
			||||||
 | 
							$('#js_message').hide();
 | 
				
			||||||
 | 
						}, 3000);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function popBox(res, id) {
 | 
				
			||||||
 | 
						if (typeof(id) == 'string') {
 | 
				
			||||||
 | 
							if (typeof(res) != 'object' && $(res).length == 0) {
 | 
				
			||||||
 | 
								res = $('<div>' + res + '</div>');
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								res = $(res);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (res.length > 0) {
 | 
				
			||||||
 | 
								var box = $('#' + id);
 | 
				
			||||||
 | 
								if (box.length < 1) {
 | 
				
			||||||
 | 
									box = $('<div id="' + id + '"></div>');
 | 
				
			||||||
 | 
									box.appendTo("body");
 | 
				
			||||||
 | 
									if (res.find('.close').length > 0) {
 | 
				
			||||||
 | 
										$('#' + id).on('click', '.close', function() {
 | 
				
			||||||
 | 
											$('#' + id).hide();
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									box.html('');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								box.show();
 | 
				
			||||||
 | 
								if (arguments.length > 2 && parseInt(arguments[2], 10) > 0) {
 | 
				
			||||||
 | 
									res.appendTo(box).pop(arguments[2]);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									res.appendTo(box).pop();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								//box.children().not(res).remove();
 | 
				
			||||||
 | 
								autoEvent('#' + id);
 | 
				
			||||||
 | 
								return res.parent();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function forceInt(obj) {
 | 
				
			||||||
 | 
						var oldVal = $(obj).val();
 | 
				
			||||||
 | 
						var newVal = $(obj).val().replace(/[^\d\.]/g, '').replace(/\..*/, '').replace(/^0+/, '0').replace(/^0*([1-9])/, '$1');
 | 
				
			||||||
 | 
						if (newVal != oldVal) $(obj).val(newVal);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function forceFloat(obj) {
 | 
				
			||||||
 | 
						var oldVal = $(obj).val();
 | 
				
			||||||
 | 
						var newVal = $(obj).val().replace(/[^\d\.]/g, '');
 | 
				
			||||||
 | 
						newVal = newVal.match(/\d*\.*\d{0,2}/)[0];
 | 
				
			||||||
 | 
						newVal = newVal.replace(/\.+/g, '.').replace(/^\./, '0.').replace(/^0+/, '0').replace(/^0*([1-9])/, '$1');
 | 
				
			||||||
 | 
						if (newVal != oldVal) $(obj).val(newVal);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function selectAll(obj, name) {
 | 
				
			||||||
 | 
						if ($(obj).attr('checked') && name) {
 | 
				
			||||||
 | 
							$(document).find(':checkbox[name*=' + name + ']').each(function() {
 | 
				
			||||||
 | 
								if (!$(this).attr('checked')) {
 | 
				
			||||||
 | 
									$(this).attr('checked', 'checked');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						} else if (name) {
 | 
				
			||||||
 | 
							$(document).find(':checkbox[name*=' + name + ']').each(function() {
 | 
				
			||||||
 | 
								if ($(this).attr('checked')) {
 | 
				
			||||||
 | 
									$(this).attr('checked', false);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function jConfirm(target, text) {
 | 
				
			||||||
 | 
						var type = 'click';
 | 
				
			||||||
 | 
						var $target = $(target);
 | 
				
			||||||
 | 
						var saveHandlers = function() {
 | 
				
			||||||
 | 
								var events = $.data(target, 'events');
 | 
				
			||||||
 | 
								if (target.href) {
 | 
				
			||||||
 | 
									// No handlers but we have href
 | 
				
			||||||
 | 
									var url = target.href;
 | 
				
			||||||
 | 
									$target.bind('click', function() {
 | 
				
			||||||
 | 
										window.location.href = url;
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
									target.href = 'javascript:void(0)';
 | 
				
			||||||
 | 
									events = $.data(target, 'events');
 | 
				
			||||||
 | 
								} else if (!events) {
 | 
				
			||||||
 | 
									// There are no handlers to save.
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								target._handlers = new Array();
 | 
				
			||||||
 | 
								for (var i in events[type]) {
 | 
				
			||||||
 | 
									target._handlers.push(events[type][i]);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						var handler = function() {
 | 
				
			||||||
 | 
								var text = $(this).attr('confirm');
 | 
				
			||||||
 | 
								if (!text) {
 | 
				
			||||||
 | 
									text = '确认进行此操作吗?';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var html = '<div class="W_layer" style="z-index:900">' + '<div class="bg">' + '<table cellspacing="0" cellpadding="0" border="0">' + '<tbody>' + '<tr>' + '<td>' + '<div class="content layer_mini_info">' + '<p class="clearfix">' + '<span class="icon_ask"></span>' + text + '</p>' + '<p class="btn">' + '<a class="btn_b yes" href="javascript:void(0)">' + '<span>??</span>' + '</a>' + '<a class="btn_d ml5 no" href="javascript:void(0)">' + '<span>??</span>' + '</a>' + '</p>' + '</div>' + '</td>' + '</tr>' + '</tbody>' + '</table>' + '</div>' + '</div>';
 | 
				
			||||||
 | 
								// show confirm box
 | 
				
			||||||
 | 
								var $box = $('#confirmBox');
 | 
				
			||||||
 | 
								if ($box.length == 0) {
 | 
				
			||||||
 | 
									$box = $('<div id="confirmBox" class="pa" style="position:absolute;overflow:hidden"><div class="confirmMask"></div><div class="confirmBody"></div></div>');
 | 
				
			||||||
 | 
									$box.appendTo("body");
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$box.html('');
 | 
				
			||||||
 | 
									$box.html('<div class="confirmMask"></div><div class="confirmBody"></div>');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$box.show();
 | 
				
			||||||
 | 
								var height = 95;
 | 
				
			||||||
 | 
								var width = 200;
 | 
				
			||||||
 | 
								var rect = this.getBoundingClientRect();
 | 
				
			||||||
 | 
								var sizeObj = $(this).getObjSize();
 | 
				
			||||||
 | 
								var newLeft = parseInt(rect.left + $(document).scrollLeft(), 10) + parseInt((sizeObj.width - width) / 2, 10);
 | 
				
			||||||
 | 
								if (newLeft + width > $(document).width()) {
 | 
				
			||||||
 | 
									newLeft = $(document).width() - width;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$box.css("top", parseInt(rect.top + $(document).scrollTop(), 10) - height + "px").css("left", newLeft + "px");
 | 
				
			||||||
 | 
								$box.css({
 | 
				
			||||||
 | 
									'width': width + 'px',
 | 
				
			||||||
 | 
									'height': height + 'px'
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								$('#confirmBox .confirmMask').css({
 | 
				
			||||||
 | 
									'width': width + 'px',
 | 
				
			||||||
 | 
									'height': height + 'px'
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								$('#confirmBox .confirmMask').show();
 | 
				
			||||||
 | 
								$('#confirmBox .confirmBody').html(html);
 | 
				
			||||||
 | 
								$('#confirmBox .confirmMask').slideUp('normal');
 | 
				
			||||||
 | 
								$('#confirmBox .confirmBody .yes').click(function() {
 | 
				
			||||||
 | 
									if (target._handlers != undefined) {
 | 
				
			||||||
 | 
										$.each(target._handlers, function() {
 | 
				
			||||||
 | 
											$target.click(this.handler);
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// Trigger click event.
 | 
				
			||||||
 | 
									$target.click();
 | 
				
			||||||
 | 
									$target.unbind(type);
 | 
				
			||||||
 | 
									$('#confirmBox .confirmMask').slideDown('normal', function() {
 | 
				
			||||||
 | 
										$target.one(type, handler);
 | 
				
			||||||
 | 
										$('#confirmBox').hide();
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								$('#confirmBox .confirmBody .no').click(function() {
 | 
				
			||||||
 | 
									$('#confirmBox .confirmMask').slideDown('normal', function() {
 | 
				
			||||||
 | 
										$('#confirmBox').hide();
 | 
				
			||||||
 | 
										$target.one(type, handler);
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						saveHandlers();
 | 
				
			||||||
 | 
						$target.unbind(type);
 | 
				
			||||||
 | 
						$target.one('click', handler);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function textCount(obj) {
 | 
				
			||||||
 | 
						if (!$(obj).attr('textCount')) {
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							var noticeDiv = false;
 | 
				
			||||||
 | 
							$(obj).parents('div').each(function() {
 | 
				
			||||||
 | 
								if (noticeDiv == false && $(this).find('.textCountTip').length > 0) {
 | 
				
			||||||
 | 
									noticeDiv = $(this).find('.textCountTip');
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							var count = $.trim($(obj).val()).length;
 | 
				
			||||||
 | 
							var limit = parseInt($(obj).attr('textCount'), 10);
 | 
				
			||||||
 | 
							if (limit >= count) {
 | 
				
			||||||
 | 
								if ($(obj).hasClass('wrongInput')) {
 | 
				
			||||||
 | 
									$(obj).removeClass('wrongInput');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								noticeDiv.html('您还能输入<em>' + (limit - count) + '</em>个字');
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if (!$(obj).hasClass('wrongInput')) {
 | 
				
			||||||
 | 
									$(obj).addClass('wrongInput');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								noticeDiv.html('已超过<em class="red">' + (count - limit) + '</em>个字');
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ajaxBox(url) {
 | 
				
			||||||
 | 
						var data = {};
 | 
				
			||||||
 | 
						if (arguments.length > 1) {
 | 
				
			||||||
 | 
							data = arguments[1];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$.post(url, data, function(res) {
 | 
				
			||||||
 | 
							if (res) {
 | 
				
			||||||
 | 
								popBox(res, 'js_ajaxBox', 500).addMask( document , 0.5, 250 );
 | 
				
			||||||
 | 
								if ($("#js_ajaxBox .Move").length >= 1) {
 | 
				
			||||||
 | 
									var size = $("#js_ajaxBox").getObjSize();
 | 
				
			||||||
 | 
									var left = $(document).width() - size.width;
 | 
				
			||||||
 | 
									var top = $(document).height() - size.height;
 | 
				
			||||||
 | 
									$("#js_ajaxBox").children(':first').Drags({
 | 
				
			||||||
 | 
										handler: '.Move',
 | 
				
			||||||
 | 
										area: [0, 0, left, top],
 | 
				
			||||||
 | 
										zIndex: 200
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								$('#js_ajaxBox').hide().html('');
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function autoEvent() {
 | 
				
			||||||
 | 
						var objs;
 | 
				
			||||||
 | 
						if (arguments.length > 0) {
 | 
				
			||||||
 | 
							objs = $(arguments[0]).find('[action-type],[confirm],[hoverTip],[urlToAjax],[textCount]');
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							objs = $('[action-type],[confirm],[hoverTip],[urlToAjax],[textCount]');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (objs.not('[switch]').length > 0) {
 | 
				
			||||||
 | 
							objs.not('[switch]').bind('click', function() {
 | 
				
			||||||
 | 
								if ($(this).attr('action-type') == 'ajaxBox') {
 | 
				
			||||||
 | 
									if ($(this).attr('action-data')) {
 | 
				
			||||||
 | 
										ajaxBox($(this).attr('action-data'));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if ($(this).attr('action-type') == 'fun') {
 | 
				
			||||||
 | 
									if ($(this).attr('action-data')) {
 | 
				
			||||||
 | 
										var fn = window[$(this).attr('action-data')];
 | 
				
			||||||
 | 
										if (typeof(fn) == 'function') {
 | 
				
			||||||
 | 
											fn(this);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if ($(this).attr('action-type') == 'selectAll') {
 | 
				
			||||||
 | 
									if ($(this).attr('action-data')) {
 | 
				
			||||||
 | 
										var name = $(this).attr('action-data');
 | 
				
			||||||
 | 
										if (select_all(this, name)) {
 | 
				
			||||||
 | 
											$('[action-type=selectAll]').filter('[action-data=' + name + ']').attr('checked', true);
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											$('[action-type=selectAll]').filter('[action-data=' + name + ']').attr('checked', false);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							//check if has selectAll 
 | 
				
			||||||
 | 
							var names = {};
 | 
				
			||||||
 | 
							objs.filter('[action-type=selectAll]').each(function() {
 | 
				
			||||||
 | 
								var obj = this;
 | 
				
			||||||
 | 
								var name = $(this).attr('action-data');
 | 
				
			||||||
 | 
								if (name && names[name] != true) {
 | 
				
			||||||
 | 
									$(':checkbox[name*=' + name + ']').live('click', function() {
 | 
				
			||||||
 | 
										if ($(':checkbox[name*=' + name + ']:checked').length != $(':checkbox[name*=' + name + ']').length) {
 | 
				
			||||||
 | 
											$('[action-type=selectAll]').filter('[action-data=' + name + ']').attr('checked', false);
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											$('[action-type=selectAll]').filter('[action-data=' + name + ']').attr('checked', true);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
									names[name] = true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							//check if has confirm
 | 
				
			||||||
 | 
							objs.filter('[confirm]').each(function() {
 | 
				
			||||||
 | 
								if (typeof($(this).attr('confirm')) != 'undefined') {
 | 
				
			||||||
 | 
									jConfirm(this, $(this).attr('confirm'));
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						objs.filter('[hoverTip]').hover(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function() {
 | 
				
			||||||
 | 
							$($(this).attr('hoverTip')).show();
 | 
				
			||||||
 | 
						}, function() {
 | 
				
			||||||
 | 
							$($(this).attr('hoverTip')).hide();
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
						objs.filter('[urlToAjax]').each(function() {
 | 
				
			||||||
 | 
							var fn = window[$(this).attr('urlToAjax')];
 | 
				
			||||||
 | 
							if (typeof(fn) == 'function') {
 | 
				
			||||||
 | 
								$(this).find('a').each(function() {
 | 
				
			||||||
 | 
									var url = $(this).attr('href');
 | 
				
			||||||
 | 
									if (url && url != '#' && url.substr(0, 11).toLowerCase() != 'javascript:') {
 | 
				
			||||||
 | 
										$(this).attr('href', 'javascript:void(0)');
 | 
				
			||||||
 | 
										$(this).bind('click', function() {
 | 
				
			||||||
 | 
											fn(this, url);
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
						objs.filter('[textCount]').each(function() {
 | 
				
			||||||
 | 
							textCount(this);
 | 
				
			||||||
 | 
							$(this).bind('propertychange', function(e) {
 | 
				
			||||||
 | 
								e.preventDefault();
 | 
				
			||||||
 | 
								textCount(this);
 | 
				
			||||||
 | 
							}).bind("input", function() {
 | 
				
			||||||
 | 
								textCount(this);
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//(function($) {
 | 
				
			||||||
 | 
					$.extend($.fn, {
 | 
				
			||||||
 | 
						getCss: function(key) {
 | 
				
			||||||
 | 
							var v = parseInt(this.css(key));
 | 
				
			||||||
 | 
							if (isNaN(v)) return false;
 | 
				
			||||||
 | 
							return v;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					$.fn.Drags = function(opts) {
 | 
				
			||||||
 | 
						var ps = $.extend({
 | 
				
			||||||
 | 
							zIndex: 20,
 | 
				
			||||||
 | 
							opacity: .7,
 | 
				
			||||||
 | 
							handler: null,
 | 
				
			||||||
 | 
							area: null,
 | 
				
			||||||
 | 
							onMove: function() {},
 | 
				
			||||||
 | 
							onDrop: function() {}
 | 
				
			||||||
 | 
						}, opts);
 | 
				
			||||||
 | 
						var dragndrop = {
 | 
				
			||||||
 | 
							drag: function(e) {
 | 
				
			||||||
 | 
								var dragData = e.data.dragData;
 | 
				
			||||||
 | 
								var left = dragData.left + e.pageX - dragData.offLeft;
 | 
				
			||||||
 | 
								var top = dragData.top + e.pageY - dragData.offTop;
 | 
				
			||||||
 | 
								if (dragData.area) {
 | 
				
			||||||
 | 
									left = Math.min(Math.max(dragData.area[0], left), dragData.area[2]);
 | 
				
			||||||
 | 
									top = Math.min(Math.max(dragData.area[1], top), dragData.area[3]);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								//left = Math.min( Math.max( 0 , left ) , ps.maxLeft );
 | 
				
			||||||
 | 
								//top = Math.min( Math.max( 0 , top ) , ps.maxTop );
 | 
				
			||||||
 | 
								dragData.target.css({
 | 
				
			||||||
 | 
									left: left,
 | 
				
			||||||
 | 
									top: top
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								dragData.handler.css({
 | 
				
			||||||
 | 
									cursor: 'move'
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								dragData.onMove(e);
 | 
				
			||||||
 | 
								e = e || window.event;
 | 
				
			||||||
 | 
								if (e.stopProgation) {
 | 
				
			||||||
 | 
									e.stopPropagation();
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									e.cancelBubble = true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (e.preventDefault) {
 | 
				
			||||||
 | 
									e.preventDefault();
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									e.returnValue = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							drop: function(e) {
 | 
				
			||||||
 | 
								var dragData = e.data.dragData;
 | 
				
			||||||
 | 
								dragData.target.css(dragData.oldCss); //.css({ 'opacity': '' });
 | 
				
			||||||
 | 
								//dragData.handler.css('cursor', dragData.oldCss.cursor);
 | 
				
			||||||
 | 
								dragData.onDrop(e);
 | 
				
			||||||
 | 
								$(document).unbind('mousemove', dragndrop.drag).unbind('mouseup', dragndrop.drop);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return this.each(function() {
 | 
				
			||||||
 | 
							var me = this;
 | 
				
			||||||
 | 
							var handler = null;
 | 
				
			||||||
 | 
							if (typeof ps.handler == 'undefined' || ps.handler == null) handler = $(me);
 | 
				
			||||||
 | 
							else handler = (typeof ps.handler == 'string' ? $(ps.handler, this) : ps.handle);
 | 
				
			||||||
 | 
							handler.bind('mousedown', {
 | 
				
			||||||
 | 
								e: me
 | 
				
			||||||
 | 
							}, function(s) {
 | 
				
			||||||
 | 
								var target = $(s.data.e);
 | 
				
			||||||
 | 
								var oldCss = {};
 | 
				
			||||||
 | 
								if (target.css('position') != 'absolute') {
 | 
				
			||||||
 | 
									try {
 | 
				
			||||||
 | 
										target.position(oldCss);
 | 
				
			||||||
 | 
									} catch (ex) {}
 | 
				
			||||||
 | 
									target.css('position', 'absolute');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								oldCss.cursor = target.css('cursor') || 'default';
 | 
				
			||||||
 | 
								//oldCss.opacity = target.getCss('opacity') || 1;
 | 
				
			||||||
 | 
								var dragData = {
 | 
				
			||||||
 | 
									left: oldCss.left || target.getCss('left') || 0,
 | 
				
			||||||
 | 
									top: oldCss.top || target.getCss('top') || 0,
 | 
				
			||||||
 | 
									width: target.width() || target.getCss('width'),
 | 
				
			||||||
 | 
									height: target.height() || target.getCss('height'),
 | 
				
			||||||
 | 
									offLeft: s.pageX,
 | 
				
			||||||
 | 
									offTop: s.pageY,
 | 
				
			||||||
 | 
									oldCss: oldCss,
 | 
				
			||||||
 | 
									area: ps.area,
 | 
				
			||||||
 | 
									onMove: ps.onMove,
 | 
				
			||||||
 | 
									onDrop: ps.onDrop,
 | 
				
			||||||
 | 
									handler: handler,
 | 
				
			||||||
 | 
									target: target
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								//target.css('opacity', ps.opacity);
 | 
				
			||||||
 | 
								$(document).bind('mousemove', {
 | 
				
			||||||
 | 
									dragData: dragData
 | 
				
			||||||
 | 
								}, dragndrop.drag).bind('mouseup', {
 | 
				
			||||||
 | 
									dragData: dragData
 | 
				
			||||||
 | 
								}, dragndrop.drop);
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					//})(jQuery); 
 | 
				
			||||||
 | 
					$(function() {
 | 
				
			||||||
 | 
						autoEvent();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					//add on
 | 
				
			||||||
 | 
					(function($, afterAjax) {
 | 
				
			||||||
 | 
						var inIframe = true;
 | 
				
			||||||
 | 
						var ajaxLock = {};
 | 
				
			||||||
 | 
						var lastTargetInfo = false;
 | 
				
			||||||
 | 
						var getEvent = function() {
 | 
				
			||||||
 | 
								if (document.all) return window.event;
 | 
				
			||||||
 | 
								func = getEvent.caller;
 | 
				
			||||||
 | 
								while (func != null && func.arguments) {
 | 
				
			||||||
 | 
									var arg0 = func.arguments[0];
 | 
				
			||||||
 | 
									if (arg0) {
 | 
				
			||||||
 | 
										if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
 | 
				
			||||||
 | 
											return arg0;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									func = func.caller;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						var getlastObj = function() {
 | 
				
			||||||
 | 
								var event = getEvent();
 | 
				
			||||||
 | 
								if (event) {
 | 
				
			||||||
 | 
									var elem = event.srcElement || event.target;
 | 
				
			||||||
 | 
									if (elem && typeof(elem.nodeType) != undefined && elem.nodeType) {
 | 
				
			||||||
 | 
										return elem;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										return false;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						var originalAjax = $.ajax;
 | 
				
			||||||
 | 
						$.ajax = function() {
 | 
				
			||||||
 | 
							if (arguments.length > 0) {
 | 
				
			||||||
 | 
								var url = arguments[0].url;
 | 
				
			||||||
 | 
								if (ajaxLock[url] == true) {
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								var originalSuccess = function() {};
 | 
				
			||||||
 | 
								var cleanLock = function() {
 | 
				
			||||||
 | 
										ajaxLock[url] = false;
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
								if (arguments[0].success) {
 | 
				
			||||||
 | 
									originalSuccess = arguments[0].success;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (inIframe) {
 | 
				
			||||||
 | 
									var elem = getlastObj();
 | 
				
			||||||
 | 
									if (elem && elem != document) {
 | 
				
			||||||
 | 
										lastTargetInfo = {};
 | 
				
			||||||
 | 
										lastTargetInfo.isLastTarget = true;
 | 
				
			||||||
 | 
										lastTargetInfo.rect = elem.getBoundingClientRect();
 | 
				
			||||||
 | 
										lastTargetInfo.size = $(elem).getObjSize();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								arguments[0].success = function(res) {
 | 
				
			||||||
 | 
									cleanLock();
 | 
				
			||||||
 | 
									if (afterAjax && typeof(afterAjax) == 'function') {
 | 
				
			||||||
 | 
										res = afterAjax(res, lastTargetInfo);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (res !== false) originalSuccess(res, lastTargetInfo);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ajaxLock[url] = true;
 | 
				
			||||||
 | 
								return originalAjax.apply(this, arguments);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.getObjSize = function() {
 | 
				
			||||||
 | 
							var size = {
 | 
				
			||||||
 | 
								'width': 0,
 | 
				
			||||||
 | 
								'height': 0,
 | 
				
			||||||
 | 
								'top': 0,
 | 
				
			||||||
 | 
								'left': 0
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							var level = 5;
 | 
				
			||||||
 | 
							var obj = this;
 | 
				
			||||||
 | 
							while (obj.outerHeight() == 0 && obj.length > 0 && level > 0) {
 | 
				
			||||||
 | 
								if (arguments.length == 1) {
 | 
				
			||||||
 | 
									obj = obj.children().find(arguments[0]);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									obj = obj.children(':first');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								level = level - 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							size.width = obj.outerWidth();
 | 
				
			||||||
 | 
							size.height = obj.outerHeight();
 | 
				
			||||||
 | 
							return size;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.getObjSize = function() {
 | 
				
			||||||
 | 
							var size = {
 | 
				
			||||||
 | 
								'width': 0,
 | 
				
			||||||
 | 
								'height': 0,
 | 
				
			||||||
 | 
								'top': 0,
 | 
				
			||||||
 | 
								'left': 0
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							var level = 5;
 | 
				
			||||||
 | 
							var obj = this;
 | 
				
			||||||
 | 
							while (obj.outerHeight() == 0 && obj.length > 0 && level > 0) {
 | 
				
			||||||
 | 
								if (arguments.length == 1) {
 | 
				
			||||||
 | 
									obj = obj.children().find(arguments[0]);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									obj = obj.children(':first');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								level = level - 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							size.width = obj.outerWidth();
 | 
				
			||||||
 | 
							size.height = obj.outerHeight();
 | 
				
			||||||
 | 
							return size;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.pop = function() {
 | 
				
			||||||
 | 
							var size = this.getObjSize();
 | 
				
			||||||
 | 
							if (this.css('position') != 'absolute') {
 | 
				
			||||||
 | 
								this.css('position','absolute');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (($(window).height() - size.height) / 2 + $(window).scrollTop() < 0) {
 | 
				
			||||||
 | 
								this.css("top", "0px");
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if (inIframe) {
 | 
				
			||||||
 | 
									var rect, rectSize;
 | 
				
			||||||
 | 
									var elem = getlastObj();
 | 
				
			||||||
 | 
									if (elem == false) {
 | 
				
			||||||
 | 
										var func = arguments.callee.caller;
 | 
				
			||||||
 | 
										do {
 | 
				
			||||||
 | 
											if (func.arguments && func.arguments.length == 2 && func.arguments[1].isLastTarget != undefined) {
 | 
				
			||||||
 | 
												var lastTarget = func.arguments[1];
 | 
				
			||||||
 | 
												rect = lastTarget.rect;
 | 
				
			||||||
 | 
												rectSize = lastTarget.size;
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											func = func.caller;
 | 
				
			||||||
 | 
										} while (func);
 | 
				
			||||||
 | 
										if (!func && lastTargetInfo) {
 | 
				
			||||||
 | 
											rect = lastTargetInfo.rect;
 | 
				
			||||||
 | 
											rectSize = lastTargetInfo.size;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										rect = elem.getBoundingClientRect();
 | 
				
			||||||
 | 
										rectSize = $(elem).getObjSize();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (!rect || !rectSize) {
 | 
				
			||||||
 | 
										this.css("top", "50px");
 | 
				
			||||||
 | 
									} else if (!$(elem).is($(this))) {
 | 
				
			||||||
 | 
										var mY = parseInt(rect.top, 10) + rectSize.height / 2 + $(document).scrollTop() - size.height / 2;
 | 
				
			||||||
 | 
										if (mY + size.height > $(window).height() + $(window).scrollTop()) {
 | 
				
			||||||
 | 
											mY = $(window).scrollTop() + $(window).height() - size.height;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										if (mY < 0) {
 | 
				
			||||||
 | 
											mY = 0;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										this.css("top", mY + "px");
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									this.css("top", ($(window).height() - size.height) / 2 + $(window).scrollTop() + "px");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							this.css("left", ($(window).width() - size.width) / 2 + $(window).scrollLeft() + "px");
 | 
				
			||||||
 | 
							if (arguments.length > 0 && parseInt(arguments[0], 10) > 0) {
 | 
				
			||||||
 | 
								this.css('z-index', parseInt(arguments[0], 10));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ($(this).find('.js_maskIframe').length == 0 && $.browser.msie && ($.browser.version == "6.0") && !$.support.style) {
 | 
				
			||||||
 | 
								if ($(document).find('select').length > 0) {
 | 
				
			||||||
 | 
									$(this).wrapInner('<div style="position:relative;width:' + size.width + 'px;height:' + size.height + 'px;" class="maskDiv"></div>');
 | 
				
			||||||
 | 
									$('.maskDiv').before('<iframe class="js_maskIframe" style="position:absolute;z-index:-1;width:' + size.width + 'px;height:' + size.height + 'px;top:' + size.top + 'px;left:' + size.left + 'px;" frameBorder=0 ></iframe>');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return this;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.blink = function() {
 | 
				
			||||||
 | 
							var o = {};
 | 
				
			||||||
 | 
							var $target = this;
 | 
				
			||||||
 | 
							var id = $(this).attr('id') || $(this).attr('name');
 | 
				
			||||||
 | 
							o[id] = {};
 | 
				
			||||||
 | 
							o[id].begin = 0;
 | 
				
			||||||
 | 
							o[id].end = 0;
 | 
				
			||||||
 | 
							o[id].lock = false;
 | 
				
			||||||
 | 
							o[id].step = 6;
 | 
				
			||||||
 | 
							o[id].times = 6;
 | 
				
			||||||
 | 
							o[id].color = function(i) {
 | 
				
			||||||
 | 
								$target.css('background', 'rgb(255,' + i + ',' + i + ')');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							o[id].color_next = function(f) {
 | 
				
			||||||
 | 
								if (o[id].begin > o[id].end) {
 | 
				
			||||||
 | 
									o[id].begin -= o[id].step;
 | 
				
			||||||
 | 
								} else if (o[id].begin < o[id].end) {
 | 
				
			||||||
 | 
									o[id].begin += o[id].step;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									o[id].lock = false;
 | 
				
			||||||
 | 
									if (typeof(f) == 'function') {
 | 
				
			||||||
 | 
										f();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								o[id].color(o[id].begin);
 | 
				
			||||||
 | 
								setTimeout(function() {
 | 
				
			||||||
 | 
									o[id].color_next(f);
 | 
				
			||||||
 | 
								}, 25);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							o[id].color_to = function(x, y, f) {
 | 
				
			||||||
 | 
								if (o[id].lock) {
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								o[id].begin = x;
 | 
				
			||||||
 | 
								o[id].end = y;
 | 
				
			||||||
 | 
								o[id].lock = true;
 | 
				
			||||||
 | 
								o[id].color_next(f);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var _c = 255 - o[id].step * o[id].times;
 | 
				
			||||||
 | 
							o[id].color_to(255, _c, function() {
 | 
				
			||||||
 | 
								o[id].color_to(_c, 255, function() {
 | 
				
			||||||
 | 
									o[id].color_to(255, _c, function() {
 | 
				
			||||||
 | 
										o[id].color_to(_c, 255);
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							return this;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.substitute = function(str) {
 | 
				
			||||||
 | 
							var obj = this[0];
 | 
				
			||||||
 | 
							if (!(Object.prototype.toString.call(str) === '[object String]')) {
 | 
				
			||||||
 | 
								return '';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (!(Object.prototype.toString.call(obj) === '[object Object]' && 'isPrototypeOf' in obj)) {
 | 
				
			||||||
 | 
								return str;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return str.replace(/\{([^{}]+)\}/g, function(match, key) {
 | 
				
			||||||
 | 
								var value = obj[key];
 | 
				
			||||||
 | 
								return (value !== undefined) ? '' + value : '';
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.setValue = function(json) {
 | 
				
			||||||
 | 
							if (typeof(json) == 'string' && arguments.length == 2) {
 | 
				
			||||||
 | 
								var key = json;
 | 
				
			||||||
 | 
								json = {};
 | 
				
			||||||
 | 
								json[key] = arguments[1];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var _this = this;
 | 
				
			||||||
 | 
							var jsonNameFormat = function( json ){
 | 
				
			||||||
 | 
								var prefix = '' , jsonFormated = {};
 | 
				
			||||||
 | 
								if( arguments[1] ){
 | 
				
			||||||
 | 
									prefix = arguments[1]; 
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$.each(json, function(name , value ){
 | 
				
			||||||
 | 
									name = prefix?prefix+'['+name+']':name;
 | 
				
			||||||
 | 
									if( typeof(value) == 'object' ){
 | 
				
			||||||
 | 
										//alert(name);
 | 
				
			||||||
 | 
										jsonFormated = $.extend( jsonFormated ,  jsonNameFormat( value , name ) );
 | 
				
			||||||
 | 
									}else{
 | 
				
			||||||
 | 
										jsonFormated[name] = value;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
								return jsonFormated;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							if (typeof(json) == 'object') {
 | 
				
			||||||
 | 
								json = jsonNameFormat( json );
 | 
				
			||||||
 | 
								$.each(json, function(name, value) {
 | 
				
			||||||
 | 
									var obj = $(_this).find(":input[name='" + name + "']");
 | 
				
			||||||
 | 
									if (obj.length > 0) {
 | 
				
			||||||
 | 
										switch (obj.get(0).type) {
 | 
				
			||||||
 | 
										case 'radio':
 | 
				
			||||||
 | 
										case 'checkbox':
 | 
				
			||||||
 | 
											obj.filter("[value='" + value + "']").filter(":not(:checked)").click();
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										case 'select-one':
 | 
				
			||||||
 | 
										case 'textarea':
 | 
				
			||||||
 | 
										case 'text':
 | 
				
			||||||
 | 
										case 'hidden':
 | 
				
			||||||
 | 
											obj.val(value);
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return this;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						$.fn.addMask = function( obj , opacity, zindex) {
 | 
				
			||||||
 | 
							var newCss = {};
 | 
				
			||||||
 | 
							newCss.width = $(obj).width() + 'px';
 | 
				
			||||||
 | 
							newCss.height = $(obj).height() + 'px';
 | 
				
			||||||
 | 
							newCss.position = 'absolute';
 | 
				
			||||||
 | 
							newCss['-moz-opacity'] = opacity;
 | 
				
			||||||
 | 
							newCss.opacity = opacity;
 | 
				
			||||||
 | 
							newCss['z-index'] = zindex;
 | 
				
			||||||
 | 
							newCss.filter = 'alpha(Opacity=' + parseFloat(opacity, 10) * 100 + ')';
 | 
				
			||||||
 | 
							if (arguments.length > 3) {
 | 
				
			||||||
 | 
								if (arguments[3]) {
 | 
				
			||||||
 | 
									newCss.background = arguments[3];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								newCss.background = '#777';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if( obj == document ){
 | 
				
			||||||
 | 
								newCss.top = '0px';
 | 
				
			||||||
 | 
								newCss.left = '0px';
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								var rect = $(obj).get(0).getBoundingClientRect();
 | 
				
			||||||
 | 
								newCss.top = rect.top + 'px';
 | 
				
			||||||
 | 
								newCss.left = rect.left + 'px';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var className;
 | 
				
			||||||
 | 
							if (arguments.length > 3) {
 | 
				
			||||||
 | 
								className = arguments[3];
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								className = 'js-mask';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							var maskDiv = $('<div></div>');
 | 
				
			||||||
 | 
							maskDiv.addClass(className);
 | 
				
			||||||
 | 
							maskDiv.css(newCss);
 | 
				
			||||||
 | 
							maskDiv.appendTo(this);
 | 
				
			||||||
 | 
							return this;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					})(jQuery, afterAjax);
 | 
				
			||||||
							
								
								
									
										83
									
								
								lib/BaseController.class.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										83
									
								
								lib/BaseController.class.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					class BaseController{
 | 
				
			||||||
 | 
						public $tplParams = array();
 | 
				
			||||||
 | 
						public $layout = NULL;
 | 
				
			||||||
 | 
						public $layoutTpl = true;
 | 
				
			||||||
 | 
						function __construct(){
 | 
				
			||||||
 | 
							//if token is expires clear it
 | 
				
			||||||
 | 
							if( $_SESSION['expiresTime'] && $_SESSION['expiresTime']  <= time() ){
 | 
				
			||||||
 | 
								$_SESSION = array();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if(isset($_GET['tokenString'])){
 | 
				
			||||||
 | 
								$tokenString=explode(".", $_GET['tokenString']);
 | 
				
			||||||
 | 
								$token= json_decode(base64_decode($tokenString[1]) , true );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($token['oauth_token']){
 | 
				
			||||||
 | 
								Weibo::init( c('akey') , c('skey') ,$tokenInfo['oauth_token'] );
 | 
				
			||||||
 | 
								Weibo::setIp('202.110.0.5');
 | 
				
			||||||
 | 
								$res = Weibo::show_user_by_id( $tokenInfo['user_id'] );
 | 
				
			||||||
 | 
								if( $res && !isset( $res['error_code'] ) ){
 | 
				
			||||||
 | 
									foreach ($res as $key => $value) {
 | 
				
			||||||
 | 
										$_SESSION[$key] = $value;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									$_SESSION['__SINA']['TOKEN'] = $tokenInfo['oauth_token'];
 | 
				
			||||||
 | 
									$_SESSION['expiresTime'] = $tokenInfo['expires'] + time();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								Weibo::init( c('akey') , c('skey') ,$_SESSION['__SINA']['TOKEN'] );
 | 
				
			||||||
 | 
								Weibo::setIp('202.110.0.5');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							//init weibo Class
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						protected function _add( $key , $value = NULL ){
 | 
				
			||||||
 | 
							if( $value == NULL && is_array($key) ){
 | 
				
			||||||
 | 
								$this->tplParams += $key;
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$this->tplParams[$key] = $value;		
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						protected function showMessage( $message , $type = 'notice' , $show = true ){
 | 
				
			||||||
 | 
							$message = '<message type="'.$type.'">'.$message.'</message>';
 | 
				
			||||||
 | 
							if( $show ){
 | 
				
			||||||
 | 
								echo $message;
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								return $message;	
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						protected function render( $tplName = NULL , $data = array() ){
 | 
				
			||||||
 | 
							if( $data && is_array( $data )  ){
 | 
				
			||||||
 | 
								$data = array_merge( $data ,  $this->tplParams );
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$data = $this->tplParams;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if( !$tplName ){
 | 
				
			||||||
 | 
								$tpl = $tplName?$tplName:get_class($this);
 | 
				
			||||||
 | 
								if( Url::getMethod() != c('default_method') ){
 | 
				
			||||||
 | 
									$tpl .= '_'.Url::getMethod();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$tpl = $tplName;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							render( $data , $tpl , $this->layout , $this->layoutTpl );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						protected function getAjax( $method , $extra = array() ){
 | 
				
			||||||
 | 
							if( !method_exists(  $this , $method ) ) die('Ajax method is not exists' );
 | 
				
			||||||
 | 
							//save  info
 | 
				
			||||||
 | 
							$url = Url::getUrl();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							$extra['method'] = $method;
 | 
				
			||||||
 | 
							$GLOBALS['__isAjax'] = true;
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							Url::setUrl( Url::make($extra) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ob_start();
 | 
				
			||||||
 | 
							$this->$method();
 | 
				
			||||||
 | 
							$html = ob_get_clean();
 | 
				
			||||||
 | 
							//replace back
 | 
				
			||||||
 | 
							unset($GLOBALS['__isAjax']);
 | 
				
			||||||
 | 
							Url::setUrl( $url );
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return $html;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										99
									
								
								lib/app.function.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										99
									
								
								lib/app.function.php
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					function checkLogin(){
 | 
				
			||||||
 | 
						if( !isLogin() ){
 | 
				
			||||||
 | 
							$back = $_SERVER['REQUEST_URI']?:'/';
 | 
				
			||||||
 | 
							if( v('ajax') && isset( $_SERVER['HTTP_REFERER'])&&$_SERVER['HTTP_REFERER'] ){
 | 
				
			||||||
 | 
								$back = $_SERVER['HTTP_REFERER'];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$state = NULL;
 | 
				
			||||||
 | 
							if( IFCookie::isNeedFix()  ){
 | 
				
			||||||
 | 
								$sid = session_id();
 | 
				
			||||||
 | 
								$state = $sid;
 | 
				
			||||||
 | 
								$back .= '&'.IFCookie::SESSIONSTR.'='.$sid;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$_SESSION['backUrl'] = $back;
 | 
				
			||||||
 | 
							$aurl = Weibo::getAuthorizeURL( c('callback') , 'code' , $state );
 | 
				
			||||||
 | 
							header("Location: ".$aurl);
 | 
				
			||||||
 | 
							exit;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function isLogin(){
 | 
				
			||||||
 | 
						if( isset( $_GET['viewer'] ) ){
 | 
				
			||||||
 | 
							if( $_GET['viewer'] == '' || $_GET['viewer'] != $_SESSION['id'] ){
 | 
				
			||||||
 | 
								$_SESSION = array();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $_SESSION['id'] ){
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}else{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					function getPager( $page , $page_all , $old = array() ,$custom  = array() ){
 | 
				
			||||||
 | 
						if( $page_all <= 1 ){
 | 
				
			||||||
 | 
							return '';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $custom && is_array($custom) ){
 | 
				
			||||||
 | 
							$custom = '&'.http_build_query($custom);
 | 
				
			||||||
 | 
						}elseif( $custom ){
 | 
				
			||||||
 | 
							$custom = '&'.$custom;
 | 
				
			||||||
 | 
						}else{
 | 
				
			||||||
 | 
							$custom = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$pre = $next = $middle = '';
 | 
				
			||||||
 | 
						$left_num = $right_num = 0;
 | 
				
			||||||
 | 
						$left_more = $right_more = false;
 | 
				
			||||||
 | 
						if( $page > 1 ){
 | 
				
			||||||
 | 
							$pre = '<li class="pref" ><a href="'.Url::make( 'page='.($page - 1).$custom  , $old ).'" title="上一页">上一页</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $page < $page_all ){
 | 
				
			||||||
 | 
							$next = '<li class="next" ><a href="'.Url::make( 'page='.($page + 1).$custom  , $old ). '"  title="下一页">下一页</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $page_all <= 11 ){
 | 
				
			||||||
 | 
							/* 小于等于 11 页 */
 | 
				
			||||||
 | 
							$left_num = $page - 1;
 | 
				
			||||||
 | 
							$right_num = $page_all - $page;
 | 
				
			||||||
 | 
						}else{
 | 
				
			||||||
 | 
							if( $page > 6 ){
 | 
				
			||||||
 | 
								$left_more = true;
 | 
				
			||||||
 | 
								if( $page < $page_all - 5 ){
 | 
				
			||||||
 | 
									$right_more = true;
 | 
				
			||||||
 | 
									$left_num = 4;
 | 
				
			||||||
 | 
									$right_num = 4;
 | 
				
			||||||
 | 
								}else{
 | 
				
			||||||
 | 
									$right_more = false;
 | 
				
			||||||
 | 
									$right_num = $page_all - $page;
 | 
				
			||||||
 | 
									$left_num = 9 - $right_num;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}else{
 | 
				
			||||||
 | 
								$left_num = $page - 1;
 | 
				
			||||||
 | 
								$left_more = false;
 | 
				
			||||||
 | 
								$right_num = 9 - $left_num;
 | 
				
			||||||
 | 
								$right_more = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $left_more ){
 | 
				
			||||||
 | 
							$middle .= '<li><a href="'.Url::make( 'page=1'.$custom , $old ).'">1</a></li>';
 | 
				
			||||||
 | 
							$middle .= '<li><a>...</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for($j=$left_num;$j>0;$j--){
 | 
				
			||||||
 | 
							$i = $page - $j;
 | 
				
			||||||
 | 
							if( $i <= 0 ){
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$middle .= '<li><a href="'.Url::make( 'page='.$i.$custom , $old ). '">' . $i .'</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$middle .= '<li class="cur"><a>' . $page . '</a></li>';
 | 
				
			||||||
 | 
						for($j=1;$j<=$right_num;$j++){
 | 
				
			||||||
 | 
							$i = $page + $j;
 | 
				
			||||||
 | 
							if( $i > $page_all ){
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$middle .= '<li><a href="'.Url::make( 'page='.$i.$custom , $old ).'">' . $i .'</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if( $right_more ){
 | 
				
			||||||
 | 
							$middle .= '<li><a>...</a></li>';
 | 
				
			||||||
 | 
							$middle .= '<li><a href="'.Url::make( 'page='.$page_all.$custom  , $old ).'">' . $page_all .'</a></li>';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return $pre.$middle.$next;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								themes/default/layout.tpl.html
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								themes/default/layout.tpl.html
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | 
				
			||||||
 | 
					<html xmlns="http://www.w3.org/1999/xhtml">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | 
				
			||||||
 | 
					<title>Engine Title 请修改在 themes/default/layout.tpl.html 修改 </title>
 | 
				
			||||||
 | 
					<link rel="stylesheet" type="text/css" href="/css/core.css" media="all" />
 | 
				
			||||||
 | 
					<script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="/js/wExpress.js"></script>
 | 
				
			||||||
 | 
					<script type="text/javascript" src="/js/core.js"></script>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					if(is_file(ROOT.'themes/default/'. $__showPage .'.tpl.html'))
 | 
				
			||||||
 | 
							include(  ROOT.'themes/default/'. $__showPage .'.tpl.html' );
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							echo "<div>can't find  $__showPage html file</div>";
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					?>
 | 
				
			||||||
 | 
					<script type="text/javascript" charset="utf-8" src="http://js.t.sinajs.cn/t4/enterprise/js/public/appframe/client.js"></script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										0
									
								
								themes/default/main.tpl.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								themes/default/main.tpl.html
									
									
									
									
									
										Normal file
									
								
							
		Reference in New Issue
	
	Block a user