/* Copyright (c) 2006, Baidu Inc. All rights reserved.
 * version: 1.0.0 
 * The BAIDU object is the single global object used by BUI Library.  It
 * contains utility function for setting up namespaces, inheritance, and
 * logging.  BAIDU.util, BAIDU.widget are namespaces created automatically
 * for and used by the library.
 * @module baidu
 * @title  BAIDU Global
 */

/*
Variable: BAIDU
 */
if (typeof BAIDU == "undefined") {
    var BAIDU = {};
}

/*
Function: BAIDU.namespace
    \u547d\u540d\u7a7a\u95f4\u7684\u5b9a\u4e49

Parameters:
    \u9700\u8981\u521b\u5efa\u7684\u547d\u540d\u7a7a\u95f4
    
Returns:
    \u8fd4\u56de\u8981\u58f0\u660e\u7684\u547d\u540d\u7a7a\u95f4\uff0c \u5982\u679c\u5b58\u5728\u7684\u8bdd\uff0c \u76f4\u63a5\u8fd4\u56de\uff0c\u4e0d\u5b58\u5728\u7684\u8bdd\uff0c \u5c31\u4f1a\u521b\u5efa\u3002

Examples:
    BAIDU.namespace("org.leeight.net");	\u8fd4\u56de\u7684\u5185\u5bb9\u5c31\u662fBAIDU['org']['leeight']['net']
    BAIDU.namespace("util", "widget"); \u8fd4\u56de\u7684\u5185\u5bb9\u5c31\u662fBAIDU['util'], BAIDU['widget']
*/
BAIDU.namespace = function() {
    var a = arguments, o = null, i, j, d;
    for (var i = 0; i < a.length; ++ i) {
	d = a[i].split(".");
	o = BAIDU;
	// BAIDU is implied, so it is ignored if it is included
	for (var j = (d[0] == "BAIDU") ? 1 : 0; j < d.length; ++ j) {
	    o[d[j]] = o[d[j]] || {};
	    o = o[d[j]];
	}
    }
    return o;
};

BAIDU.namespace("util","widget");

/*
Function: Object.extend
    \u5c06src\u7684\u6240\u6709\u5c5e\u6027\u590d\u5236\u5230des\u4e2d\u53bb, \u5982\u679c\u5c5e\u6027\u76f8\u540c\u5c31\u4f1a\u8986\u76d6.

Parameters:
    src - \u6e90\u5bf9\u8c61
    des - \u76ee\u6807\u5bf9\u8c61\uff0c\u4ecesrc\u7ee7\u627f\u5c5e\u6027

Returns:
    \u5177\u6709src\u5c5e\u6027\u7684des\u5bf9\u8c61

Examples:
    var a = {};
    var b = { m:1 };
    Object.extend(a, b);
    alert(a.m); \u53ef\u4ee5\u770b\u5230a\u5177\u6709\u4e86\u5c5e\u6027m, \u5e76\u4e14\u503c\u7b49\u4e8e1
*/
Object.extend = function(des,src) {
    for (var property in src) {
    	des[property] = src[property];
    }
    return des;
};

Object.extend(Object,{

	/*
	Function: Object.clone
		\u62f7\u8d1d\u4e00\u4e2a\u5bf9\u8c61\uff0c\u5e76\u8fd4\u56de

	Parameters:
		object - \u88ab\u62f7\u8d1d\u7684\u5bf9\u8c61

	Returns:
		\u8fd4\u56de\u4e0eobject\u4e00\u6837\u7684\u5bf9\u8c61

	Examples:
		var a = {m:1};
		var b = Object.clone(a);
		alert(b.m);    // \u53ef\u4ee5\u770b\u5230a\u5177\u6709\u4e86\u5c5e\u6027m, \u5e76\u4e14\u503c\u7b49\u4e8e1
	*/
	clone: function(object){
		return Object.extend({}, object);
	}
});

/*
Variable: Class
    \u5b9a\u4e49\u4e86\u4e00\u4e2a\u53ef\u4ee5\u652f\u6301\u6784\u9020\u51fd\u6570\u7684\u7c7b\u5bf9\u8c61.

Examples:
    var obj = new Class();
 
*/
var Class = function() {
    var _class =  function() { 	
		this.initialize.apply(this, arguments);
    };

    for(var i = 0; i < arguments.length; i ++) {
	var superClass = arguments[i];
		for(var member in superClass.prototype)	{
			_class.prototype[member]=superClass.prototype[member];

		}
    };

    _class.child = function(){
		return new Class(this);
    };
    
    _class.extend = function(source) {
		for(var p in source){
			_class.prototype[p] = source[p];
		}
    };
    return _class;
};

/*
Function: G
	\u83b7\u53d6\u8282\u70b9\u5bf9\u8c61

Parameters:
    arguments - \u53ef\u4ee5\u4f20\u9012\u4e00\u4e2a\u6216\u8005\u591a\u4e2a\u8282\u70b9\u5143\u7d20\u7684id\u6216\u8005name

Return:
    \u8fd4\u56de\u8282\u70b9\u5bf9\u8c61\u6216\u8005\u8282\u70b9\u5bf9\u8c61\u7684\u6570\u7ec4
*/
var G = function(){
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if(typeof element == 'string'){	
			element = document.getElementById(element);
		}
		if (arguments.length == 1) 
			return element;
		elements.push(element);
	}
	return elements;
};
/*
Function: Function.prototype.bind
    \u4e00\u4e2a\u5f88\u91cd\u8981\u7684\u65b9\u6cd5\uff0c \u53ef\u4ee5\u5c06Function\u7ed1\u5b9a\u5230\u67d0\u4e2a\u5bf9\u8c61\u8fd0\u884c.\u540c\u65f6\u4fdd\u6301\u548c\u5411\u4e0a\u7684\u7248\u672c\u517c\u5bb9.

Parameters:
    arguments[0] - \u7ed1\u5b9a\u7684\u76ee\u7684\u5730(object)
    arguments[1...n] - \u4f20\u9012\u7684Parameters

Examples:
    var obj1 = { m:"obj1" };
    var obj2 = { 
	m:"obj2",
	method:function(arg){
	    alert(arg + this.m);
	}
    };
    obj2.method("this is ")\u5c06\u4f1a\u663e\u793a"this is obj2";
    obj2.method.bind(obj1, "now this is ")\u663e\u793a"now this is obj1"
*/

Function.prototype.bind = function() {
	var args = [];
	for(var i=0,len=arguments.length;i<len;i++)
		args.push(arguments[i]);
    var __method = this, object = args[0];
    return function() {
		return __method.apply(object, args);
    }
};
						  
/*
Function: Function.prototype.bindAsEventListener
    \u5c06Function\u4f5c\u4e3a\u5bf9\u8c61\u7684\u4e8b\u4ef6\u76d1\u542c\u5668\uff0c\u8fd9\u6837\u53ef\u4ee5\u4ea7\u751f\u72ec\u7acb\u800c\u4e14\u901a\u7528\u7684\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f.

Parameters:
    object - \u7ed1\u5b9a\u7684\u5bf9\u8c61

Examples:
    function clickHandler(e){
	// \u5904\u7406e\u7684\u5355\u51fb\u4e8b\u4ef6
    }

    \u5047\u8bbe\u6709\u8282\u70b9node\uff0c\u5219\uff1a
    node.onclick = clickHandler.bindAsEventListener(this)(event || window.event);
		
*/			
Function.prototype.bindAsEventListener = function(object) {
    var __method = this;
    return function(event) {
		__method.call(object, event || window.event);
    }
};

/*
Function: Try.these
	\u7528\u6765\u6d4b\u8bd5\u4f20\u9012\u7684Parameters\u4e2d\u662f\u5426\u542b\u6709\u53ef\u4ee5\u6b63\u786e\u6267\u884c\u7684Function. \u5e76\u6267\u884c\u7b2c\u4e00\u4e2a\u6b63\u786e\u7684Function\u51fd\u6570

Parameters:
	arguments - \u542b\u6709\u4e00\u4e2a\u6216\u8005\u591a\u4e2aFunction\u5bf9\u8c61

Returns:
	\u8fd4\u56de\u7b2c\u4e00\u4e2a\u53ef\u4ee5\u6b63\u786e\u6267\u884c\u7684Function\u51fd\u6570\u7684\u6267\u884c\u7ed3\u679c\u3002
*/
var Try = {
    these: function() {
		var returnValue;
		for (var i = 0; i < arguments.length; i++) {
			var lambda = arguments[i];
			try {
				returnValue = lambda();
				break;
			} catch (e) {}
		}
		return returnValue;
    }
};
