Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

var escape_tag = function (str) {
    return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
var unescape_tag = function (str) {
    return str.replace(/&quot;/g, '"').replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&amp;/g, '&');
}
var $A = function (args) {
    for ( var i = 0, l = args.length, res = []; i < l; res.push(args[i]), i++ );
    return res;
}
var $ = function (id) {
    return document.getElementById(id);
}
var jump_to = function (uri) {
    location.href = uri;
}
var jump_to_pc = function () {
    jump_to( location.href.replace("lite.", "") );
}
var ClassName = {
    add: function (el, className) {
        if ( !ClassName.has(el, className) ) {
            el.className += ( el.className ? ' ' : '' ) + className;
        }
    },
    remove: function (el, className) {
        var reg = new RegExp('(^| +)' + className + '($| +)');
        el.className = el.className.replace(reg, ' ');
    },
    has: function (el, className) {
        var reg = new RegExp('(^| +)' + className + '($| +)');
        return reg.test(el.className);
    },
    exchange: function (el, removeClassName, addClassName) {
        ClassName.remove(el, removeClassName);
        ClassName.add(el, addClassName);
    }
}
var to_string = function (params, do_encode) {
    var res = [],
        enc = do_encode ? encodeURIComponent : function(v){return v};
    for ( var k in params ) {
        res.push( k + "=" + enc(params[k]) );
    }
    return res.join('&');
}
var post = function (url, params, callback) {
    var req    = new XMLHttpRequest,
        params = params || "";
    req.open("POST",url,true);
    req.onload = function(){
        eval('var data = ' + req.responseText);
        callback(data);
    };
    req.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded");
    if ( typeof params != 'string' ) {
        params = to_string(params, true);
    }
    req.send(params);
}
var fillMsg = {
    set: function (elem, msg, msg_color, def_color) {
        var elem = ( typeof elem == 'string' ) ? $( elem ) : elem;
        if ( !elem ) return;
        elem.addEventListener('focus', this._focus.bind(this, arguments), false);
        elem.addEventListener('blur', this._blur.bind(this, arguments), false);
        this._blur(arguments);
        this.elems.push(arguments);
    },
    setSubmit: function (form) {
        $(form).addEventListener('submit', function () {
            this.elems.each(function (args) {
                this._focus(args);
            }.bind(this));
        }.bind(this), false);
    },
    _focus: function (args) {
        if ( args[0].value == args[1] && this.toHex( args[0].style.color ) == ( args[2] || "#AAAAAA" ) ) {
            args[0].value = "";
            args[0].style.color = args[3] || "#000000";
        }
    },
    _blur: function (args) {
        if ( args[0].value == "" ) {
            args[0].value = args[1];
            args[0].style.color = args[2] || "#AAAAAA";
        }
    },
    toHex: function (color) {
        return  ( /^#/.test( color ) || !color ) ? color.toUpperCase() : "#" + color.match(/\d+/g).map(function (code) {
            return ((+code) >> 4 ? '' : 0) + (+code).toString(16);
        }).join("").toUpperCase();
    },
    elems: []
}
var create_lightbox = function (outer_id, content_id) {
    var outer   = $( outer_id ),
        content = $( content_id );
    outer.style.height = document.body.clientHeight + "px";
    ClassName.remove(outer, "hide");
    var top  = 100,
        left = ( window.innerWidth / 2 ) - 110;
    content.style.top  = top + "px";
    content.style.left = left + "px";
    location.href = "#container";
    ClassName.remove(content, "hide");
    return {
        hide: function () {
            ClassName.add(outer, "hide");
            ClassName.add(content, "hide");
        },
        update: function (html) {
            content.innerHTML = html;
        }
    };
}

var ua = navigator.userAgent.toLowerCase();
var browser = {
    safari  : /safari/.test( ua ),
    iphone  : /iphone/.test( ua ),
    mozilla : /mozilla/.test( ua )
};