﻿/* Geometry */
var Geometry = {};

Geometry.getWindowX = function() { return window.screenLeft || window.screenX; };
Geometry.getWindowY = function() { return window.screenTop || window.screenY; };
Geometry.getViewportWidth = function() {
    return window.innerWidth || 
        document.documentElement && document.documentElement.clientWidth || 
        document.body.clientWidth;
};
Geometry.getViewportHeight = function() {
    return window.innerHeight || 
        document.documentElement && document.documentElement.clientHeight || 
        document.body.clientHeight;
};
Geometry.getHorizontalScroll = function() {
    return window.pageXOffset || 
        document.documentElement.scrollLeft || 
        document.body.scrollLeft;
};
Geometry.getVerticalScroll = function() {
    return window.pageYOffset ||
        document.documentElement.scrollTop || 
        document.body.scrollTop;
};

Geometry.getDocumentHeight = function() {
    return (window.innerHeight && window.scrollMaxY) ?
        window.innerHeight + window.scrollMaxY : (document.body.scrollHeight > document.body.offsetHeight) ? 
                                                    document.body.scrollHeight : document.body.offsetHeight;
};
/*End Geometry*/

//修改Array原型
Array.prototype.indexOf=function(substr,start){
	var ta,rt,d='\0';
	if(start!=null){ta=this.slice(start);rt=start;}else{ta=this;rt=0;}
	var str=d+ta.join(d)+d,t=str.indexOf(d+substr+d);
	if(t==-1)return -1;rt+=str.slice(0,t).replace(/[^\0]/g,'').length;
	return rt;
};

Array.prototype.lastIndexOf=function(substr,start){
	var ta,rt,d='\0';
	if(start!=null){ta=this.slice(start);rt=start;}else{ta=this;rt=0;}
	ta=ta.reverse();var str=d+ta.join(d)+d,t=str.indexOf(d+substr+d);
	if(t==-1)return -1;rt+=str.slice(t).replace(/[^\0]/g,'').length-2;
	return rt;
};

Array.prototype.replace=function(reg,rpby){
	var ta=this.slice(0),d='\0';
	var str=ta.join(d);str=str.replace(reg,rpby);
	return str.split(d);
};

Array.prototype.search=function(reg){
	var ta=this.slice(0),d='\0',str=d+ta.join(d)+d,regstr=reg.toString();
	reg=new RegExp(regstr.replace(/\/((.|\n)+)\/.*/g,'\\0$1\\0'),regstr.slice(regstr.lastIndexOf('/')+1));
	t=str.search(reg);if(t==-1)return -1;return str.slice(0,t).replace(/[^\0]/g,'').length;
};
Array.prototype.include = function(el) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == el) return true;
    }
    return false;
};
//END 修改Array原型
/*StringBuilder*/
function StringBuilder(str){
    this.tmp = new Array();
};
StringBuilder.prototype.Append = function(value){
    this.tmp.push(value);
    return this;
};
StringBuilder.prototype.Clear = function(){
    this.tmp.length = 1;
};
StringBuilder.prototype.toString = function(){
    return this.tmp.join('');
};
/*End StringBuilder*/
/*String*/
String.prototype.trueLength   =   function()   
{   
    return   this.replace(/[^\x00-\xff]/g,   "**").length;   
};

/*End String*/
//删除左边指定字符
function LTrim(str,delStr)
{
    var whitespace = new String(delStr);
    var s = new String(str);
     
    if (whitespace.indexOf(s.charAt(0)) != -1)
    {
        var j=0, i = s.length;
        while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
        {
            j++;
        }
        s = s.substring(j, i);
    }
    return s;
};
//删除右边指定字符
function RTrim(str,delStr)
{
    var whitespace = new String(delStr);
    var s = new String(str);
     
    if (whitespace.indexOf(s.charAt(s.length-1)) != -1)
    {
        var i = s.length - 1;
        while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
        {
            i--;
        }
        s = s.substring(0, i+1);
    }
    return s;
};
//删除首尾边指定字符
function TrimLR(str,delStr)
{
    return RTrim(LTrim(str,delStr),delStr);
};


//去除空格
function Trim(str)
{
  return str.replace(/(\s*$)|(^\s*)/g,"");
};
//去除字符串末尾的所有空格
function TrimEnd(str)
{
	if( str != null && str.length > 0 )
	{
		var strChar = "";
		while( str.length > 0 )
		{
			strChar = str.substr( str.length-1,1 );
			if( strChar == " " && str.length > 0 )
			{
				str = str.substr( 0,str.length-1 );
			}
			else
				break;	
		}
	}
	
  return str;
};
//去字符串前面的所有空格
function TrimStart(str)
{
	if( str != null && str.length > 0 )
	{
		var strChar = "";
		while( str.length > 0 )
		{
			strChar = str.substr( 0,1 );
			if( strChar == " " && str.length > 0 )
			{
				str = str.substr( 1,str.length-1 );
			}
			else
				break;	
		}
	}
	
  return str;
};
//将悬浮层的位置定位在屏幕中央
function GetCenterXY_ForLayer(objdiv)
{
	x = document.body.scrollLeft;
	y = document.body.scrollTop;

	//获取屏幕宽度
	availWidth = parseInt(window.screen.availWidth);
	availHeight = parseInt(window.screen.availHeight);

	tblWidth = parseInt(objdiv.width);

	y = y + availHeight/4;
	x = (availWidth - tblWidth)/2;

	objdiv.style.top = y;
	objdiv.style.left = x;
}

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }

    return returnValue;
  }
};

var Ajax = function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
};

//取地址栏参数
var request = 
{ 
    QueryString : function(val) 
    { 
        var uri = window.location.search; 
        var re = new RegExp("" +val+ "=([^&?]*)", "ig"); 
        return ((uri.match(re))?(uri.match(re)[0].substr(val.length+1)):""); 
    } 
};
//取指定串(模拟地址栏)参数
var requestFromStr = 
{ 
    QueryString : function(Str,val) 
    { 
        var uri = Str.substring(0,1) == "?" ? Str : "?" + Str; 
        var re = new RegExp("[&?]" +val+ "=([^&?]*)", "ig"); 
        return ((uri.match(re))?(uri.match(re)[0].substr(val.length+2)):""); 
    } 
};

function getY(el) {
    var y = 0;
    for(var e = el; e; e = e.offsetParent) // Iterate the offsetParents
        y += e.offsetTop;                       // Add up offsetTop values

    // Now loop up through the ancestors of the element, looking for
    // any that have scrollTop set. Subtract these scrolling values from
    // the total offset. However, we must be sure to stop the loop before
    // we reach document.body, or we'll take document scrolling into account
    // and end up converting our offset to window coordinates.
    for(e = el.parentNode; e && e != document.body; e = e.parentNode)
        if (e.scrollTop) y -= e.scrollTop;  // subtract scrollbar values

    // This is the Y coordinate with document-internal scrolling accounted for.
    return y;
}

// Get the X coordinate of the element e.
function getX(el) {
    var x = 0;
    while(el) {
        x += el.offsetLeft;    // Add in the offset
        el = el.offsetParent;   // And move up to the offsetParent
    }
    return x;                 // Return the total offsetLeft
}	

//UrlEncode
function UrlEncode(str){
    return escape(str).replace(/\+/g,"%2b");
}
//UrlDecode
function UrlDecode(str){
    return unescape(str).replace(/%2b/g,"+");
}

//取随机浮点数
rnd.today=new Date();
rnd.seed=rnd.today.getTime();
function rnd() {
    rnd.seed = (rnd.seed*9301+49297) % 233280;
    return rnd.seed/(233280.0);
}
//取指定范围内的随机整数
function rand(number) {
        return Math.ceil(rnd()*number);
}
//考虑了全半角的SubString
function GetSubString(str,len)
{
    if(len == "undefined")
    {
        return str;
    }
    var newStr = new Array();
    var index =0;
    for(var i=0;i<=str.length-1;i++)
    {
        var _str = str.substring(i,i+1);
        var code = escape(str.charAt(i));
//        if(_str.match(/^[\u4e00-\u9fa5]*$/g) != null)
        if ((code.length >= 4) && (code < '%uFF60' || code > '%uFF9F'))
        {
            index = index + 2;
        }
        else
        {
            index = index + 1;
        }
        if(index <= len)
        {
            newStr.push(_str);
        }
        else
        {
            newStr.push("...");
            break;
        }
    }
    return newStr.join("");
}

//加载脚本
function ScriptLoader() {
	this.load = function(url) {
		//获取所有的<scrcipt>标记
		var scripts = document.getElementsByTagName("script");
		//判断指定的文件是否已经包含，如果已包含则触发onSuccess事件并返回
		for(i = 0;i < scripts.length; i++) {
			if(scripts[i].src && scripts[i].src.indexOf(url) != -1){
				this.onSuccess();
				return;
			}
		}
		//创建script结点，并将其属性设为为外联JavaScript文件
		script = document.createElement("script");
		script.type = "text/javascript";
		script.src = url;
		//获取head结点，并将<script>插入到其中
		var head = document.getElementsByTagName("head")[0];
		head.appendChild(script);
		//获取对象自身的引用
		var self = this;

		//IE: onreadystatechange; FF: onload
		script.onload = script.onreadystatechange = function(){
			//在此函数中this指针指的是script结点对象，而不是JsLoader实例，所以必须用self来调用onSuccess事件，下同。
			if(this.readyState && this.readyState == "loading") return;
			self.onSuccess();
		};
		script.onerror = function() {
			//如果发生错误，则删除插入的结点，并触发失败事件
			head.removeChild(script);
			self.onFailure();
		};
	};
	//定义载入成功事件
	this.onSuccess = function() {};
	//定义载入失败事件
	this.onFailure = function(){};
}


