/* Copyright (c) 2006, Hexun Inc. All rights reserved.
 * version: 1.0.0 
 * The HEXUN object is the single global object used by BUI Library.  It
 * contains utility function for setting up namespaces, inheritance, and
 * logging.  HEXUN.util, HEXUN.widget are namespaces created automatically
 * for and used by the library.
 * @module hexun
 * @title  HEXUN Global
 */

/*
Variable:
 */
if (typeof HEXUN == "undefined") {
    var HEXUN = {};
}

/*
Function: HEXUN.namespace
    命名空间的定义

Parameters:
    需要创建的命名空间
    
Returns:
    返回要声明的命名空间， 如果存在的话， 直接返回，不存在的话， 就会创建。

Examples:
    HEXUN.namespace("org.leeight.net");	返回的内容就是HEXUN['org']['leeight']['net']
    HEXUN.namespace("util", "widget"); 返回的内容就是HEXUN['util'], HEXUN['widget']
*/
HEXUN.namespace = function() {
    var a = arguments, o = null, i, j, d;
    for (var i = 0; i < a.length; ++ i) {
	d = a[i].split(".");
	o = HEXUN;

	// HEXUN is implied, so it is ignored if it is included
	for (var j = (d[0] == "HEXUN") ? 1 : 0; j < d.length; ++ j) {
	    o[d[j]] = o[d[j]] || {};
	    o = o[d[j]];
	}
    }
    return o;
};

HEXUN.namespace("util","widget");

/*
Function: Object.extend
    将src的所有属性复制到des中去, 如果属性相同就会覆盖.

Parameters:
    src - 源对象
    des - 目标对象，从src继承属性

Returns:
    具有src属性的des对象

Examples:
    var a = {};
    var b = { m:1 };
    Object.extend(a, b);
    alert(a.m); 可以看到a具有了属性m, 并且值等于1
*/
Object.extend = function(des,src) {
    for (var property in src) {
    	des[property] = src[property];
    }
    return des;
};

/*
Variable: 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: Function.prototype.bind
    一个很重要的方法， 可以将Function绑定到某个对象运行.同时保持和向上的版本兼容.

Parameters:
    arguments[0] - 绑定的目的地(object)
    arguments[1...n] - 传递的Parameters

Examples:
    var obj1 = { m:"obj1" };
    var obj2 = { 
	m:"obj2",
	method:function(arg){
	    alert(arg + this.m);
	}
    };
    obj2.method("this is ")将会显示"this is obj2";
    obj2.method.bind(obj1, "now this is ")显示"now this is obj1"
*/

Function.prototype.bind = function() {
    var __method = this, args = (arguments), object = args.shift();
    return function() {
	return __method.apply(object, args.concat(arguments));
    }
}
						  
/*
Function: Function.prototype.bindAsEventListener
    将Function作为对象的事件监听器，这样可以产生独立而且通用的事件处理程序.

Parameters:
    object - 绑定的对象

Examples:
    function clickHandler(element){
	// 处理element的单击事件
    }

    假设有节点node，则：
    node.onclick = function(){
	clickHandler.bindAsEventListener(this)(event || window.event);
    }
		
*/			
Function.prototype.bindAsEventListener = function(object) {
    var __method = this;
    return function(event) {
	__method.call(object, event || window.event);
    }
}

/*
Variable: Try
    用来测试传递的Parameters中是否含有可以正确执行的Function.

Parameters:
    arguments - 含有一些Function对象的数组

Returns:
    返回第一个可以正确执行的Function的Returns.
*/
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;
    }
}
