// Author : Hangring
// Email: outlou [at] hotmail [dot] com

// browser type
var browser = {
    ie : document.all 
         && navigator.userAgent.indexOf( "MSIE" ) > -1
         && navigator.userAgent.indexOf( "Opera" ) == -1 
         ? true : false,
    opera : navigator.userAgent.indexOf( "Opera" ) > -1 ? true : false,
    moz : ( !document.all && document.getElementById ) ? true : false
}

// html
function HTML () {
    var _s = 'br,hr,img,input,map,meta,optgroup,param';
    var _html
        = 'a,abbr,acronym,address,area,b,base,bdo,big,blockquote,body,br,button,'
        + 'caption,center,cite,code,col,colgroup,dd,del,dir,div,dfn,dl,dt,em,fieldset,'
        + 'font,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,i,iframe,img,'
        + 'input,ins,kbd,label,legend,li,link,map,meta,noframes,noscript,object,ol,'
        + 'optgroup,option,p,param,pre,q,s,samp,script,select,small,span,strike,'
        + 'strong,style,sub,sup,table,tbody,td,textarea,tfoot,th,thead,title,tr,tt,'
        + 'u,ul,var';

    _s = _s.split(',');
    _html = _html.split(',');

    // standard
    for (var i = 0; i < _html.length; i++) {
        for (var j = 0; j < _s.length; j++) {
            if (_s[j] == _html[i]) {
                eval(
                    '$' + _html[i] 
                    + ' = function (obj) '
                    + '{return $target_single("' + _html[i] + '", obj);}'
                );
                break;
            }
        }
        if (j == _s.length) {
            eval(
                '$' + _html[i] 
                + ' = function (obj, str) '
                + '{return $target_both("' + _html[i] + '", obj, str);}'
            );
        }
    }

    // extends
    !arguments[0] || HTML_only(arguments[0]);
}

function HTML_only () {
    var $_ = arguments;
    if ($_.length > 0) {
        $_ = $_[0].split(' ');
    }

    for (i = 0; i < $_.length; i++) {
        if ($_[i].indexOf('_') > -1) {
            var tag = $_[i].split('_')[1];
            eval(
                '$start_' + tag
                + ' = function (obj) '
                + '{return $target_start("' + tag + '", obj);}'
            );
            eval (
                '$end_' + tag 
                + ' = function () '
                + '{return $target_end("' + tag + '");}'
            );
        }
        else {
            eval(
                '$' + $_[i] 
                + ' = function (obj, str) '
                + '{return $target_both("' + $_[i] + '", obj, str);}'
            );
        }
    }
}

// html full
function $target_both (tag, obj, _v) {
    if (typeof obj == 'string') {
        _v = obj;
        return '<' + tag + '>' + _v + '<\/' + tag + '>';
    }
    else {
        if (typeof _v == 'undefined') _v = ''; 
        return $target_start(tag, obj) + _v + '<\/' + tag + '>';
    }
}

// html single
function $target_single (tag, obj) {
    return '<' + tag + ' ' + attributes(obj) + '\/>';
}

// html open target
function $target_start (tag, obj) {
    return '<' + tag + ' ' + attributes(obj) + '>';
}

// html close target
function $target_end (tag) {
    return '<\/' + tag + '>';
}

// attribute string to `name=value`
function attributes (obj) {
    var str = '';
    if (typeof obj == 'object') {
        for (var item in obj) {
            str += item + '="' + obj[item] + '" ';
        }
    }
    return str;
}
HTML_only('script font span lable object param');

/*
  <<<<<<
*/

function use () {
    document.writeln(
        $script({type:'text\/javascript',
                src:arguments[0].replace(/\$::/g, "..\/").replace(/::/g, "\/") + '.js'})
    );
}
function require () {
    document.writeln($script({type:'text\/javascript', src:arguments[0]}));
}

// 获得对象
function getObject ($_) {
    $_ = (document.all && document.all($_))
          || (document.getElementById && document.getElementById($_))
          || null;
    return $_;
}

// 获取事件来源
function getEvent (e) {
    // 返回对应的浏览器event
    return document.all ? window.event : e;
}

function getEventObject (e_obj) {
    // e_obj 为 getEvent(e) 获得的对象
    // 返回捕捉此事件的对象
    return (document.all) ? e_obj.srcElement : e_obj.target;
}

function getForm () {
    return arguments[0] ? document.forms[arguments[0]] : document.forms;
}

function get_E_B_Tag () {
    return document.getElementsByTagName(arguments[0]);
}

// 判断是否为日期
var isDate = function (date) {
    if (/^[1-9][0-9]{3}-(?:[1-9]|1[0-2])-(?:[1-9]|[1-3][0-9])$/.exec(date) != null) {
        // 格式 2005-1-1 00:00:00
    }
    else if (/^$/.exec(date) != null) {
        // 格式 2005-1-1
    }
    else {
        return false
    }
}

// 去除首尾空格
String.prototype.trim = function () {
    return this.valueOf().ltrim().rtrim()
}
String.prototype.ltrim = function () {
    return this.valueOf().replace(/^\s+/, "")
}
String.prototype.rtrim = function () {
    return this.valueOf().replace(/\s+$/, "")
}

// 清楚HTML标记
String.prototype.HtmlEncode = function () {
    return this.valueOf()
           .replace(/&/g, "&amp;")
           .replace(/</g, "&lt;")
           .replace(/>/g, "&gt;")
           .replace(/\"/g, "&quot;")
           .replace(/\'/g, "&#39;")
}
// 还原字符
String.prototype.HtmlToText = function () {
    return this.valueOf()
           .replace(/&amp;/g, "&")
           .replace(/&lt;/g, "<")
           .replace(/&gt;/g, ">")
           .replace(/&quot;/g, "\"")
           .replace(/&#39;/g, "'")
           .replace(/&nbsp;/g, " ")
}

/*
    字符串省略显示(与文档定义无关)
    # 2006.1.9, Achieve
    ------
    所操作的字符串应该为原始字符串，即非html格式的字符（如：&amp;,&lt;等等）
    函数接受6个参数：
        1：字符串所在容器宽度的大小（如：100px） **必填
        2：字符串所在容器的字号（如：9pt, 1em），单位可以为pt或em  **必填
        3：字符串是否为粗体
        4：字符串是否为斜体
        5：字符间隔数（如：2px），单位只能为px
        6：这个为非用户设置（程序运行时用）
    在操作过程中将建立一个String.omit_char对象，
    随着不同字号的操作，将依次为String.omit_char对象添加新建立的对象
    ------
    事先测定特定字符的宽度
    所存储的宽度应为内容宽度，而非：'内容宽度' + 'border-width' + 'padding'
*/
String.prototype.omit = function (Length, fontSize, fontWeight, fontStyle, letterSpacing) {
    var val = this.valueOf().replace(/\s+/g, " ").HtmlToText();
    var val_len_return = "" , lens = 0;
    var chars_display_count = 0;
    var i;

    // 若传递的字符串为空
    if (!val.trim()) {
        return ""
    }
    // Length
    if (/^[1-9]+\d*$/.exec(Length) == null) {
        return $font({color:'#ff000'}, 'Length 参数错误！');
    }

    // fontSize
    if (/^[1-9]+\d*(?:em|pt)$/.exec(fontSize) == null) {
        return $font({color:'#ff000'}, 'Length 参数错误！');
    }

    // 获得字体权重
    if (fontWeight) {
        fontWeight = "font-weight: bold;"
    }
    else {
        fontWeight = ""
    }

    // 获得字体类型
    if (fontStyle) {
        fontStyle = "font-style: italic;"
    }
    else {
        fontStyle = ""
    }

    // 字符间隔
    if (/^[1-9]+\d*(?:em|pt|px)$/.exec(letterSpacing) == null) {
        letterSpacing = 0
    }

    // 获得信息
    if (typeof String.omit_char == "undefined" ) {
        // 新建omit_char对象，进行存储存储
        String.omit_char = {
            chars : "一0123456789abcdefghijklmnopqrstuvwxyz"
                    + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                    + "~!@#$%^&*()_+|`-=\\{}[]:\";'<>?,.\/ "
        }
    }
    var lstr = "charsList_" + fontSize;
    if (typeof String.omit_char[lstr] == "undefined") {
        var obj;
        var fstr = "test_fontsize_" + fontSize;
        String.omit_char[lstr] = [];
        document.body.innerHTML
            += $span({id:fstr,style:'font-size:' + fontSize + ';' + fontWeight + fontStyle}, '一');
        obj = getObject(fstr);
        for (var i = 0; i < String.omit_char.chars.length; i++) {
            // 内建的，不可修改
            obj.innerHTML
                = String.omit_char.chars.substr(i, 1)
                  .replace(/&/g, "&amp;")
                  .replace(/>/g, "&gt;")
                  .replace(/</g, "&lt;")
                  .replace(/\s/g, "&nbsp;");
            String.omit_char[lstr][i] = obj.offsetWidth;
        }
        // 直接销毁对象
        obj.outerHTML = "";
        //obj.innerHTML = "";
        //obj.style.disply = "none";
    }

    // 操作部分
    for (i = 0; i < val.length; i++) {
        var charcode = val.charCodeAt (i);
        if (charcode > 255){
            if (lens + String.omit_char[lstr][0] + parseInt(letterSpacing) >= Length) {
                break
            }
            else {
                lens += String.omit_char[lstr][0]
                        + parseInt(letterSpacing);
            }
        }
        else {
            if (
                 lens
                 + String.omit_char[lstr][String.omit_char.chars.indexOf(val.substr (i, 1))]
                 + parseInt(letterSpacing)
                 >= Length
               ) {
                break
            }
            else {
                lens += String.omit_char[lstr][String.omit_char.chars.indexOf(val.substr (i, 1))]
                        + parseInt(letterSpacing);
            }
        }
        val_len_return += "" + val.substr (i, 1);
    }
    // 判断是否为字符串尾
    if (i < val.length) {
        if (arguments[5]) {
            // 返回信息
            return val_len_return.HtmlEncode()
        }
        return val.omit(
                   Length
                   - 3 * String.omit_char[lstr][String.omit_char.chars.indexOf('.')]
                   - 3 * parseInt(letterSpacing)
                   , fontSize
                   , fontWeight
                   , fontStyle
                   , letterSpacing
                   , true
               )
               + "..."
    }
    // 返回信息
    return val_len_return.HtmlEncode()
}

// 字符串方法len,left,right
String.prototype.len = function() {
    var val = this.valueOf();
    var val_len, val_len_return, charcode;
    val_len = typeof val == "string" ? val.length : 0;
    val_len_return = val_len;
    if ( val_len > 0 ) {
        for ( var i = 0; i< val_len; i++ ) {
            charcode = val.charCodeAt(i);
            if ( charcode > 255 ){
                val_len_return += 1
            } else {
                if ( browser.ie || browser.opera || !browser.moz ) {
                    if ( charcode == 109 || charcode == 119 || (charcode > 65 && charcode < 91) ) {
                        val_len_return += 1
                    } 
                }
            }
        }
    }
    return val_len_return
}

String.prototype.left = function( Length ) {
    var val = this.valueOf();
    var val_len_return , lens;
    var charcode;
    val_len_return = ""; lens = 0;
    for ( var i = 0; i < val.length && i < Length; i++ ) {
        val_len_return += "" + val.substr ( i, 1 );
        charcode = val.charCodeAt ( i );
        if ( charcode > 255 ){
            lens += 2
        } else {
            if ( browser.ie || browser.opera || !browser.moz ) {
                if ( charcode == 109 || charcode == 119 || (charcode > 65 && charcode < 91) ) {
                    lens += 2
                } else {
                    lens += 1
                }
            } else {
                lens += 1
            }
        }
        if ( lens >= Length ) break
    }
    return val_len_return
}

String.prototype.right = function( Length ) {
    var val = this.valueOf();
    var val_len_return, lens;
    var charcode;
    val_len_return = ""; lens = 0;
    for ( var i = val.length - 1; i > -1; i-- ) {
        val_len_return = val.substr ( i, 1 ) + "" + val_len_return;
        charcode = val.charCodeAt ( i );
        if ( charcode > 255 ){
            lens += 2
        } else {
            if ( browser.ie || browser.opera || !browser.moz ) {
                if ( charcode == 109 || charcode == 119 || (charcode > 65 && charcode < 91) ) {
                    lens += 2
                } else {
                    lens += 1
                }
            } else {
                lens += 1
            }
        }
        if ( lens >= Length ) break
    }
    return val_len_return
}

// 在相对小的范围缩略字符串
String.prototype.ellipsis = function ( casewidth, fontsize ) {
    var val = this.valueOf();
    var lens = val.len();
    if ( lens * fontsize > casewidth ) {
        return $lable({title:val}, val.left( Math.floor( casewidth / fontsize ) ) + '...');
    } else {
        return val;
    }
}

// include swf
var rnd = new Date().getTime();
function swfobject (src, w, h, obj) {
    var str = '';

    //if (!obj.bg) {
    //    obj.bg = '';
    //}
    if (!obj.src) {
        obj.src = '';
    }
    if (obj.id) {
        obj.id = ['id="' + obj.id + '"', 'name="' + obj.id + '"'];
    }
    else {
        obj.id = ['', ''];
    }

    src += '.swf';
    str = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
          + 'codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" '
          + 'width="' + w + '" height="' + h + '" align="middle" ' + obj.id[0] + '>'
          + '<param name="allowScriptAccess" value="sameDomain" \/>';

    if (obj.bool) {
        str += '<param name="wmode" value="transparent" \/>';
    }

    str += '<param name="movie" value="' + src + '" \/>'
           + '<param name="flashvars" value="rnd=' + rnd + '&' + obj.src + '">'
           + '<param name="quality" value="high" \/>'
           + (obj.bg ? '<param name="bgcolor" value="' + obj.bg + '" \/>' : '')
           + '<param name="menu" value="false" \/>'
           + '<embed src="' + src + '" flashvars="rnd=' + rnd + '&' + obj.src
           + '" quality="high" ' + (obj.bg ? 'bgcolor="' + obj.bg : '')
           + '" width="' + w + '" height="' + h 
           + '" menu="false" align="middle" ' + (obj.bool ? 'wmode="transparent"' : '')
           + ' allowScriptAccess="sameDomain"  swLiveConnect="true" '
           + 'type="application/x-shockwave-flash" ' + obj.id[0] + ' ' + obj.id[1]
           + ' pluginspage="http://www.macromedia.com/go/getflashplayer"';

    if (obj.bool) {
        str += ' wmode="transparent"';
    }

    str += ' \/>'
        + '<\/object>';
    return str;
}

/*
// outerHTML
if(window.HTMLElement) {
    HTMLElement.prototype.__defineSetter__(
        "outerHTML",
        function (s) {
            var range = this.ownerDocument.createRange();
            range.setStartBefore(this);
            var fragment = range.createContextualFragment(s);

            this.parentNode.replaceChild(fragment, this);
        }
    );
}
*/

// init event，halt error
//window.onerror = function () {return true};
window.onloadTasks = new Array();
window.onload = function () {
    for (var i = 0; i < onloadTasks.length; i++) {
        eval(onloadTasks[i])();
    }
}

/*
  <<<<<<
*/

//use('$::js::Class::Document');