jQuery.extend({objTostr:function(obj){
function __typeof(objClass){if(objClass&&objClass.constructor){var strFun = objClass.constructor.toString();var className =strFun.substr(0, strFun.indexOf('('));className = className.replace('function', '');return className.replace(/(^\s*)|(\s*$)/ig, '');}return typeof(objClass);}
function OutJsObject(Arr,Tab){
var Rstr=new Array();Tab+="   ";
for (var i in Arr){
//if(typeof(Arr[i])=="function")continue;
var Item=Tab+"   ["+i+"]=>"+OutJsVal(Arr[i],Tab);
Rstr.push(Item);
}
return{Rstr:Rstr.join("\n"),Tab:Tab};}
function OutJsVal(Obj,Tab)
{   
var Typ=typeof(Obj);
if(Obj==null)return null;
if(Typ=="function"){return "[function]";}
if(Typ=="number"||Typ=="boolean"||Typ=="string"){return Obj;}
if(Typ=="object"){
if(Obj instanceof Number||Obj instanceof Boolean||Obj instanceof String){return Obj.toString();}
else if(Obj instanceof Array){var Sd= OutJsObject(Obj,Tab);var Tb=Sd.Tab;return "Array\n"+Tb+"(\n"+Sd.Rstr+"\n"+Tb+")";}
else if(Obj.toString()!="[object Object]")
{
return Obj.toString();
}
else{var Tname=__typeof(Obj);var Sd= OutJsObject(Obj,Tab);var Tb=Sd.Tab;return Tname+" Object\n"+Tb+"(\n"+Sd.Rstr+"\n"+Tb+")";}
}
return "";
}
var Str=OutJsVal(obj,"");
return Str; },trace:function(obj){alert(this.objTostr(obj));}});
jQuery.fn.extend({trace:function(obj){this.html("<pre>"+$.objTostr(obj)+"</pre>");}});
jQuery.extend((function()
{
  //  设置PHP文件编码---------
  var PHP_Ecoding="utf-8";
  //-------------------
  //获得编码的字节长度
  var getCharLength=function(str){
  if(PHP_Ecoding.toLowerCase()=="utf-8")
  return str.replace(/[^\x00-\xff]/g,"***").length;
  else
  return str.replace(/[^\x00-\xff]/g,"**").length;
  }
  //计算对象长度 不包括function
  var CountObject=function(Obj){var l=0;for (var i in Obj){if(php_typeof(Obj[i])=="N"&&Obj[i]!=null)continue;l++;}return l;}
  //返回对象带名称类型
  var __typeof=function(objClass)
  {
   if (objClass&&objClass.constructor)
   {
   var strFun = objClass.constructor.toString();
   var className =strFun.substr(0, strFun.indexOf('('));
   className = className.replace('function', '');
   return className.replace(/(^\s*)|(\s*$)/ig, '');  
   }
   return typeof(objClass);
  }
  //返回对应PHP的类型
  var php_typeof =function(Obj)
  {
  switch(typeof(Obj))
  {
  case "number": return /^-?\d+$/.test(Obj)?"i":"d";break;
  case "string": return "s";break;
  case "boolean":return "b";break;
  case "object":
  {
   if(Obj==null) return "N";
   if(Obj instanceof Array)return "a";
   if(Obj.toString()=="[object Object]")return "O";
   else return "N";
   break;
  }
  default :return "N";break;
  }
  }
  //获得值的PHP代码-----------------
  var php_getValCode=function(Obj)
  {
  if(typeof(Obj)=="function")return "";
  var Typ=php_typeof(Obj);
  if(Typ=="i"||Typ=="d"){return Typ+":"+Obj+";"}
  else if(Typ=="b"){return Typ+":"+(Obj==true?1:0)+";"}
  else if(Typ=="s"){return "s:"+getCharLength(Obj)+":\""+Obj+"\";"}
  else if(Typ=="a"){return "a:"+CountObject(Obj)+":"+"{"+php_getObjCode(Obj)+"}";}
  else if(Typ=="O"){
  var Tname=__typeof(Obj);
  if(Tname=="Object")Tname="stdClass";
  return Typ+":"+Tname.length+":\""+Tname+"\":"+CountObject(Obj)+":{"+php_getObjCode(Obj)+"}";
  }
  else {return "N;";}
  return "";
  }
  //获得对象的PHP代码-----------------
  var php_getObjCode=function(Obj)
  {
  var Rstr="";
  for (var i in Obj)
  {
  var Item="";
  i=/^\d+$/.test(i)?Number(i):i;
  var Str=Obj[i];
  if(php_typeof(Str)=="N"&&Str!=null)continue;
  var KeyTyp=php_typeof(i);
  if(KeyTyp=="i"){Item=KeyTyp+":"+i+";";}
  else if(KeyTyp=="s"){Item=KeyTyp+":"+getCharLength(i)+":\""+i+"\";";}
  else {continue;}
  Item+=php_getValCode(Str);
  Rstr+=Item;
  }
  return Rstr;
  }
  //解析PHP对象==================
  var exposition_php=function(Str)
  {
  var key;
  var val;
  key=Str.substr(0,1);
  if(key=="N"){
  val=null;
  var Idx=Str.indexOf(";",0);
  Str=Str.substring(Idx+1);
  }
  if(key=="i"||key=="d"){
  var Idx=Str.indexOf(";",2);
  if(Idx===false)return null;
  val=Number(Str.substring(2,Idx));
  Str=Str.substring(Idx+1);
  }
  if(key=="b"){
  var Idx=Str.indexOf(";",2);
  if(Idx===false)return null;
  val=Number(Str.substring(2,Idx))==0?false:true;
  Str=Str.substring(Idx+1);
  }
  if(key=="s"){
  var Idx=Str.indexOf(":",2);
  if(Idx===false)return null;
  var Len=Number(Str.substring(2,Idx));
  Idx=Str.indexOf("\"",Idx);
  if(Idx===false)return null;
  val=Str.substr(Idx+1,Len);
  //------------------------
  var nLen=Len;
  var char_Len=getCharLength(val);
  var Dec =parseInt(Len/2);
  //使用增量快速查找-------
  while(char_Len!=Len){
  if(char_Len>Len){nLen-=Dec;}else{nLen+=Dec;}
  val=Str.substr(Idx+1,nLen);
  char_Len=getCharLength(val);
  Dec =parseInt(Dec/2);
  if(Dec==0)Dec=1;
  }
  Len=nLen;
  //-------------------------
  Str=Str.substring(Idx+Len+3);
  }
  if(key=="a"){
  val=new Array(); 
  var Idx=Str.indexOf(":",2);
  if(Idx===false)return null;
  var Len=Number(Str.substring(2,Idx));
  Idx=Str.indexOf("{",Idx);
  if(Idx===false)return null;
  Str=Str.substring(Idx+1);   
  for(var i=0;i<Len;i++)
  {
  var MKeyobj=exposition_php(Str);
  if(MKeyobj==null)return null;
  Str=MKeyobj.str;
  var Mvalobj=exposition_php(Str);
  if(Mvalobj==null)return null;
  Str=Mvalobj.str;
  val[MKeyobj.val]=Mvalobj.val;
  }
  Idx=Str.indexOf("}");
  if(Idx===false)return null;
  Str=Str.substring(Idx+1);
 }
  if(key=="O"){
  var Idx=Str.indexOf(":",2);
  if(Idx===false)return null;
  var sLen=Number(Str.substring(2,Idx));
  Idx=Str.indexOf("\"",Idx);
  if(Idx===false)return null;
  var Fval=Str.substr(Idx+1,sLen);
  if(Fval=="stdClass")Fval="Object";
  eval("val=new "+Fval+"();");
  Idx=Idx+sLen+3;
  var Edx=Str.indexOf(":",Idx);
  if(Edx===false)return null;
  var Len=Number(Str.substring(Idx,Edx));
  Idx=Str.indexOf("{",Edx);
  if(Edx===false)return null;
  Str=Str.substring(Idx+1);
  if(Idx===false)return null;
  for(var i=0;i<Len;i++)
  {
  var MKeyobj=exposition_php(Str);
  if(MKeyobj==null)return null;
  Str=MKeyobj.str;
  var Mvalobj=exposition_php(Str);
  if(Mvalobj==null)return null;
  Str=Mvalobj.str;
  val[MKeyobj.val]=Mvalobj.val;
  }
  Idx=Str.indexOf("}");
  if(Idx===false)return null;
  Str=Str.substring(Idx+1);
 }
  
  return {val:val,str:Str};
  }
  
  
  var _serialize=function(Obj,Ecoding)
  {
  PHP_Ecoding=Ecoding||PHP_Ecoding;
  return php_getValCode(Obj);
  }
  var _unserialize=function(Str,Ecoding)
  {
  PHP_Ecoding=Ecoding||PHP_Ecoding;
  var Obj=exposition_php(Str);
  if(Obj!=null)
  return Obj.val;
  else
  return null;
  }
  return {php_serialize:_serialize,php_unserialize:_unserialize}
})());