/** Util.js */
var ua = {};
ua.ie =
    !!(!window.opera && window.attachEvent);
ua.opera = !!window.opera;
ua.firefox = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1;

var Util = {};
Util.emptyFunction = function(){};
var Class = function(){
    var klass = function(){
        this.constructor = arguments.callee;
        this.initialize.apply(this,arguments);
        return this;
    }
    return klass
};
Class.extend = function(des,or){
    for(var key in or)
        des[key] = or[key];
    return des;
};
Object.extend = Class.extend;
Object.recursiveExtend = function(des,or){
    for(var key in or){
        if(typeof or[key] == "object")
            des[key] = Object.extend({},or[key]);
        else
            des[key] = or[key];
    }
    return des;
};
var toArray = function(ar){
    var r = [];
    for(var i=0,l=ar.length;i<l;i++){
        r.push(ar[i]);
    }
    return r;
};
var foreach = function(a,itr){
    var res = []
    for(var i=0,l=a.length;i<l;i++){
        var r;
        r = itr.apply(a[i],[a[i],i,l]);
        if(r === false) break;
        else res.push(r);
    }
    return res;
};
var inspect = function(obj){
    var str = "";
    for(var k in obj)
        str += k + ": " + obj + "\n";
    alert(str);
};
var $ = function(idstr){
    var r = [];
    for(var i=0,l=arguments.length;i<l;i++)
        r.push(document.getElementById(arguments[i]));
    if(r.length == 0)
        return null;
    else if(r.length == 1)
        return r[0];
    else
        return r;
}
var setEvent = 
    document.addEventListener ? 
        function(e,type,handle,flag){
            var flag = flag || false;
            e.addEventListener(type,handle,flag);
            window.addEventListener('unload',function(){removeEvent.apply(null,[e,type,handle,flag])},false);
        } :
        function(e,type,handle){
            e.attachEvent('on' + type,handle);
            window.attachEvent('onunload',function(){removeEvent.apply(null,[e,type,handle])});
        };
var removeEvent = 
    document.addEventListener ? 
    function(e,type,handler,flag){
        var flag = flag || false;
        e.removeEventListener(type,handler,flag)
    } :
    function(e,type,handle){
        e.detachEvent('on' + type,handle);
    };


var HTML = new Class();
Class.extend(HTML,{
    setAttrs: function(node,attrs){
        for(var key in attrs){
            if(key == 'class')node['className'] = attrs[key];
            else node[key]=attrs[key];
        }
        return node;
    },
    create: function(){
        var tag = arguments[0],
            attrs = arguments[1] || null,
            elm,
            childs;
        if(arguments[2])
            childs = toArray(arguments).slice(2);
        
        if(tag.tagName || tag.nodeName == '#text') elm = tag;
        else if(typeof tag == 'string'){
            if(tag != '#text')elm = document.createElement(tag);
            else elm = document.createTextNode(attrs);
        }
        if(attrs && tag != '#text')HTML.setAttrs(elm,attrs);
        if(childs){
            foreach(childs,function(i){
                if(i.tagName || i.nodeName == '#text')elm.appendChild(i);
            })
        }
        return elm;
    },
    kill: function(elm){
        elm.parentNode.removeChild(elm);
    }
});

var Function = new Class();
Class.extend(Function,{
    'bind': function(func,obj){
        return function(){
            return func.apply(obj,arguments);
        }
    },
    'curry': function(func,arg){
        return function(){
            var args = [];
            args.push.apply(args,arguments);
            return func.apply(null,[arg].concat(args));
        }
    }
})

var Cookie = new Class();
Class.extend(Cookie,{
    'future': "Thu, 1-Jan-2030 00:00:00 GMT",
    'past': "Fri, 31-Dec-1999 23:59:59 GMT",
    'cookieDate': function(date){
        var days = ["Sun","Mon","Tue","Wed","Thu","Fri","Sut"];
        var mons = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
        var str = days[date.getUTCDay()] + " "
        + mons[date.getUTCMonth()] + " "
        + date.getUTCHours() + ":" + date.getUTCMinutes() 
            + ":" + date.getUTCSeconds()
        + " GMT";
        return str;
    },
    'setCookie': function(key,val){
        var eVal = escape(val);
        document.cookie = key + "=" + eVal + "; expires=" + Cookie.future + ";";
    },
    'getCookie': function(key){
        var reg = new RegExp(key +"=([^;]*)");
        if(reg.test(document.cookie)){
            var val = document.cookie.match(reg)[1];
            return unescape(val);
        }else
            return null;
    },
    'setHash': function(hash){
        for(var key in hash)
            Cookie.setCookie(key,hash[key]);
    },
    'deleteCookie': function(key){
        document.cookie = key + "=;" + "expires=" + Cookie.past + ";";
    },
    'deleteAll': function(){
        var keys = document.cookie.match(/[^= ;]*=/g);
        if(!keys)return;
        foreach(keys,function(i,n){
            keys[n] = i.replace(/=/,"");
            Cookie.deleteCookie(keys[n]);
        });
    },
    'getHash': function(keys){
        var r = {}
        for(var i=0,l=keys.length;i<l;i++){
            var v = Cookie.getCookie(keys[i]);
            if(v)
                r[keys[i]] = unescape(v);
        }
        return r;
    }
});