All about Mobile, Web, Technology, Politics, Security, E-Commerce and Living in the Philippines.

Tuesday, March 07, 2006

SAJAX Class

I forked SAJAX into OOP so its cleaner but still works like the original.

class sajax {
var $sajax_version = '0.12';
var $sajax_debug_mode = 0;
var $sajax_export_list = array();
var $sajax_request_type = 'GET';
var $sajax_remote_uri = '';
var $sajax_failure_redirect = '';
var $sajax_remote_uri ='';
var $sajax_js_has_been_shown = 0;

function sajax (){
$this->sajax_remote_uri = $this->sajax_get_my_uri();
}

function sajax_get_my_uri() {
return $_SERVER["REQUEST_URI"];
}

function sajax_get_js_repr($value) {
$type = gettype($value);
if ($type == "boolean") {
return ($value) ? "Boolean(true)" : "Boolean(false)";
}
elseif ($type == "integer") {
return "parseInt($value)";
}
elseif ($type == "double") {
return "parseFloat($value)";
}
elseif ($type == "array" || $type == "object" ) {
$s = "{ ";
if ($type == "object") {
$value = get_object_vars($value);
}
foreach ($value as $k=>$v) {
$esc_key = $this->sajax_esc($k);
if (is_numeric($k))
$s .= "$k: " . $this->sajax_get_js_repr($v) . ", ";
else
$s .= "\"$esc_key\": " . $this->sajax_get_js_repr($v) . ", ";
}
if (count($value))
$s = substr($s, 0, -2);
return $s . " }";
}
else {
$esc_val = $this->sajax_esc($value);
$s = "'$esc_val'";
return $s;
}
}

function sajax_handle_client_request() {
$mode = "";
if (! empty($_GET["rs"]))
$mode = "get";
if (!empty($_POST["rs"]))
$mode = "post";
if (empty($mode))
return;

$target = "";
if ($mode == "get") {
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache"); // HTTP/1.0
$func_name = $_GET["rs"];
if (! empty($_GET["rsargs"]))
$args = $_GET["rsargs"];
else
$args = array();
} else {
$func_name = $_POST["rs"];
if (! empty($_POST["rsargs"]))
$args = $_POST["rsargs"];
else
$args = array();
}
if (! in_array($func_name, $this->sajax_export_list))
return false;
else {
echo "+:";
$result = call_user_func_array(array(&$this,$func_name), $args);
echo "var res = " . trim($this->sajax_get_js_repr($result)) . "; res;";
}
exit;
}

function sajax_get_common_js() {
$t = strtoupper($this->sajax_request_type);
if ($t != "" && $t != "GET" && $t != "POST")
return "// Invalid type: $t.. \n\n";
ob_start();
?>
// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_debug_mode = sajax_debug_mode ? "true" : "false"; ?>;
var sajax_request_type = "";
var sajax_target_id = "";
var sajax_failure_redirect = "sajax_failure_redirect; ?>";

function sajax_debug(text) {
if (sajax_debug_mode)
alert(text);
}

function sajax_init_object() {
sajax_debug("sajax_init_object() called..")

var A;

var msxmlhttp = new Array(
'Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0',
'Msxml2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i = 0; i < msxmlhttp.length ; i++) {
try {
A = new ActiveXObject(msxmlhttp[i]);
} catch (e) {
A = null;
}
}

if(!A && typeof XMLHttpRequest != "undefined")
A = new XMLHttpRequest();
if (!A)
sajax_debug("Could not create connection object.");
return A;
}

var sajax_requests = new Array();

function sajax_cancel() {
for (var i = 0; i < sajax_requests.length; i++)
sajax_requests[i].abort();
}

function sajax_do_call(func_name, args) {
var i, x, n;
var uri;
var post_data;
var target_id;

sajax_debug("in sajax_do_call().." + sajax_request_type + "/" + sajax_target_id);
target_id = sajax_target_id;
if (typeof(sajax_request_type) == "undefined" || sajax_request_type == "")
sajax_request_type = "GET";

uri = "sajax_remote_uri; ?>";
if (sajax_request_type == "GET") {

if (uri.indexOf("?") == -1)
uri += "?rs=" + escape(func_name);
else
uri += "&rs=" + escape(func_name);
uri += "&rst=" + escape(sajax_target_id);
uri += "&rsrnd=" + new Date().getTime();

for (i = 0; i < args.length-1; i++)
uri += "&rsargs[]=" + escape(args[i]);

post_data = null;
}
else if (sajax_request_type == "POST") {
post_data = "rs=" + escape(func_name);
post_data += "&rst=" + escape(sajax_target_id);
post_data += "&rsrnd=" + new Date().getTime();

for (i = 0; i < args.length-1; i++)
post_data = post_data + "&rsargs[]=" + escape(args[i]);
}
else {
alert("Illegal request type: " + sajax_request_type);
}

x = sajax_init_object();
if (x == null) {
if (sajax_failure_redirect != "") {
location.href = sajax_failure_redirect;
return false;
} else {
sajax_debug("NULL sajax object for user agent:\n" + navigator.userAgent);
return false;
}
} else {
x.open(sajax_request_type, uri, true);
// window.open(uri);

sajax_requests[sajax_requests.length] = x;

if (sajax_request_type == "POST") {
x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}

x.onreadystatechange = function() {
if (x.readyState != 4)
return;

sajax_debug("received " + x.responseText);

var status;
var data;
var txt = x.responseText.replace(/^\s*|\s*$/g,"");
status = txt.charAt(0);
data = txt.substring(2);

if (status == "") {
// let's just assume this is a pre-response bailout and let it slide for now
} else if (status == "-")
alert("Error: " + data);
else {
if (target_id != "")
document.getElementById(target_id).innerHTML = eval(data);
else {
try {
var callback;
var extra_data = false;
if (typeof args[ args.length-1] == "object") {
callback = args[args.length-1].callback;
extra_data = args[args.length-1].extra_data;
} else {
callback = args[args.length-1];
}
callback(eval(data), extra_data);
} catch (e) {
sajax_debug("Caught error " + e + ": Could not eval " + data );
}
}
}
}
}

sajax_debug(func_name + " uri = " + uri + "/post = " + post_data);
x.send(post_data);
sajax_debug(func_name + " waiting..");
delete x;
return true;
}

$html = ob_get_contents();
ob_end_clean();
return $html;
}

function sajax_show_common_js() {
echo $this->sajax_get_common_js();
}

// javascript escape a value
function sajax_esc($val)
{
$val = str_replace("\\", "\\\\", $val);
$val = str_replace("\r", "\\r", $val);
$val = str_replace("\n", "\\n", $val);
$val = str_replace("'", "\\'", $val);
return str_replace('"', '\\"', $val);
}

function sajax_get_one_stub($func_name) {
ob_start();
?>

// wrapper for

function x_() {
sajax_do_call("",
x_.arguments);
}
$html = ob_get_contents();
ob_end_clean();
return $html;
}

function sajax_show_one_stub($func_name) {
echo $this->sajax_get_one_stub($func_name);
}

function sajax_export() {
$n = func_num_args();
for ($i = 0; $i < $n; $i++) {
$this->sajax_export_list[] = func_get_arg($i);
}
}


function sajax_get_javascript()
{
$html = "";
if (! $this->sajax_js_has_been_shown) {
$html .= $this->sajax_get_common_js();
$this->sajax_js_has_been_shown = 1;
}
foreach ($this->sajax_export_list as $func) {
$html .= $this->sajax_get_one_stub($func);
}
return $html;
}

function sajax_show_javascript()
{
echo $this->sajax_get_javascript();
}
}


Saturday, March 04, 2006

IT managers to ban Google Desktop over security fears.

According to the article published by Silicon.com, UK IT managers are taking measures to ban and purge Google Desktop (GDS) on their networks. It is said on the article that one of the main reason is that the new version of GDS which allows ‘search across computers’ poses an unacceptable risk to many organizations.

Upon just reading the first few lines of the story, I can immediately say this story is just blown out of proportion and a total BS. First of all, on a corporate network setup GDS should never be installed nor anything else should be installed unless its required to perform the task assigned to a project or IT department on general which usually falls in the Acceptable Use Policy (AUP) of the company.

In my opinion, any IT company which allows users to install applications such as GDS, Yahoo IM, Skype, mIRC, p2p or any messaging and desktop enhancements in the first place is just plain lame. Of course they are security risk, any application that’s not audited for security and stability is a risk; it doesn’t only compromise security but productivity as well! If search functionality is really needed by a company they should buy a search appliance which is offered by many search companies as well as Google.

(update)

I have received alot of emails regarding this post and i wish to clarify.

- I'm not saying all the mentioned application would be banned, only that AUP shouldn't allow them to be installed on corporate networks. If you are using it on your own personal/home internet network then its fine.

- In special cases such that companies have disjoint internal and external networks then as long as AUP says it wont endanger the secured network then fine, use it.

- I guess my statement is valid only on "general" corporate setup, but if your asking me if this should hold true under speacial network setups in your own offices then your Administrator and IT managers are the ones more capable of determining the suitable AUP for you :)


Wednesday, March 01, 2006

Relive the Gundam Era

I’m a fan of mech genre movies and games so if you are too then you don’t want to miss the entire Gundam SEED series now playing at YouTube.com, they are all in Japanese but subtitled on English. Thanks for Cremet for uploading the videos!

Just visit this URL: http://www.youtube.com/profile_videos?user=cremet&page=1

 

Related Links