﻿var configdiv = function(targetid, scripturl, inputstr, replacetag, template, maxsets) {

    //输入参数的容错处理；
    if (maxsets == undefined)
        maxsets = { maxrc: '20', maxcs: '20', maxw: '200', maxn: '100' };

    var maxrc = maxsets.maxrc == undefined ? '20' : maxsets.maxrc;
    var maxcs = maxsets.maxcs == undefined ? '20' : maxsets.maxcs;
    var maxw = maxsets.maxw == undefined ? '200' : maxsets.maxw;
    var maxn = maxsets.maxn == undefined ? '100' : maxsets.maxn;
    var scurl=scripturl;

    //输入模板的容错处理；
    var defaulttemplate = '<div>' +
    //Repeat Column：文本框，输入数字（1-20）默认1
                                    '<div class=configlabel><label>Repeat Column</label></div>' +
                                    '<div class=configitem >' +
                                        '<input id=rcinput type=text value=1 />' +
                                        '<span id=rcspan></span>' +
                                    '</div>' +
                                    '<div class=clear></div>' +
   
    //Cell Space：文本框，数字（1-20）默认2
                                    '<div class=configlabel><label>Cell Space</label></div>' +
                                    '<div class=configitem>' +
                                        '<input id=csinput type=text  value=2 >' +
                                        '<span id=csspan></span>' +
                                    '</div>' +
                                    '<div class=clear></div>' +
    //Width:文本框，数字（1-200）默认 80
                                    '<div class=configlabel><label>Width</label></div>' +
                                    '<div class=configitem>' +
                                            '<input id=winput type=text  value=80 />' +
                                            '<span id=wspan></span>' +
                                    '</div>' +
                                    '<div class=clear></div>' +

    //Number:文本框，数字（1-100）默认 8
                                    '<div class=configlabel><label>Number</label></div>' +
                                    '<div class=configitem>' +
                                            '<input id=ninput type=text  value=8 />' +
                                             '<span id=nspan></span>' +
                                    '</div>' +
                                    '<div class=clear></div>' +
    //确定和取消按钮
                                    '<div class=submitdiv><input id=sbutton type=button value=submit><input id=cbutton type=button value=cancle /></div>' +
                                    '<div id=putoutdiv>' +
                                        '<input type=text readOnly=true id=putout />' +
                                    '</div>' +
                                    '<div class=clear></div>' +
                                    '</div>';

    var tl;
    if (typeof template != 'string' || template == '' || template == undefined)
        template = defaulttemplate;
    tl = template;

    this.init(targetid, inputstr,scripturl, tl, maxrc, maxcs, maxw, maxn, replacetag);
}

Function.prototype.method = function(name, fn) {
    this.prototype[name] = fn;
    return this;
}

configdiv.method('init', function(targetid, inputstr, scripturl, template, maxrc, maxcs, maxw, maxn, replacetag) {

    var targeta = document.getElementById(targetid);
    var input = inputstr;
    var offset = getOffSet(targeta);
    var rc, rcspan, rd, cs, csspan, w, wspan, n, nspan, submit, cancle;
    var scurl = scripturl;
    var ontgclick = function(e) {

        //如果显示了就返回；
        var oldconfig = document.getElementById('configdiv');
        if (oldconfig != null)
            return;
        var confightml = document.createElement('div');
        confightml.id = "configdiv";
        confightml.className = "config";
        confightml.style.left = offset.left + 'px';
        confightml.style.top = offset.top + targeta.scrollHeight + 'px';
        confightml.innerHTML = template;
        document.body.appendChild(confightml);

        rc = document.getElementById('rcinput');
        rcspan = document.getElementById('rcspan');
       // rd = document.getElementById('rdselect');
       // cs = document.getElementById('csinput');
       // csspan = document.getElementById('csspan');
       // w = document.getElementById('winput');
       // wspan = document.getElementById('wspan');
        n = document.getElementById('ninput');
        nspan = document.getElementById('nspan');

        submit = document.getElementById('sbutton');
        cancle = document.getElementById('cbutton');


        if (rc == null || rcspan == null || n == null || nspan == null || submit == null || cancle == null) {
            document.body.removeChild(confightml);
            return;
        }

        //只允许输入数字；http://hi.baidu.com/jinlijun_998/blog/item/d8f8d2199720e04242a9adfe.html
        //限制输入长度；
        var onkeydown = function(event) {
            if (!(event.keyCode == 46) && !(event.keyCode == 8) && !(event.keyCode == 37) && !(event.keyCode == 39))
                if (!((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105))) {
                stopBubble(event);
                stopDefault(event);
            } else {
                var myself = getTargetElement(event);
                //限制输入长度；
                if (myself.id == 'rcinput') {
                    if (myself.value.length >= maxrc.length) {
                        stopBubble(event);
                        stopDefault(event);
                    }
                } else if (myself.id == 'csinput') {
                    if (myself.value.length >= maxcs.length) {
                        stopBubble(event);
                        stopDefault(event);
                    }

                } else if (myself.id == 'winput') {
                    if (myself.value.length >= maxw.length) {
                        stopBubble(event);
                        stopDefault(event);
                    }

                } else if (myself.id == 'ninput') {
                    if (myself.value.length >= maxn.length) {
                        stopBubble(event);
                        stopDefault(event);
                    }
                }
            }
        }

        //验证最大值
        var onblur = function(e) {

            var myself = getTargetElement(e);

            if (myself.id == 'rcinput') {
                if (parseInt(myself.value) > maxrc || myself.value == '' || parseInt(myself.value) == 0)
                    rcspan.innerHTML = '1-' + maxrc;
                else
                    rcspan.innerHTML = '';
            } else if (myself.id == 'csinput') {
                if (parseInt(myself.value) > maxcs || myself.value == '' || parseInt(myself.value) == 0)
                    csspan.innerHTML = '1-' + maxcs;
                else
                    csspan.innerHTML = '';

            } else if (myself.id == 'winput') {
                if (parseInt(myself.value) > maxw || myself.value == '' || parseInt(myself.value) == 0)
                    wspan.innerHTML = '1-' + maxw;
                else
                    wspan.innerHTML = '';
            } else if (myself.id == 'ninput') {
                if (parseInt(myself.value) > maxn || myself.value == '' || parseInt(myself.value) == 0)
                    nspan.innerHTML = '1-' + maxn;
                else
                    nspan.innerHTML = '';
            }
        }

        addEventHandler(rc, 'blur', onblur);
       // addEventHandler(cs, 'blur', onblur);
      //  addEventHandler(w, 'blur', onblur);
        addEventHandler(n, 'blur', onblur);

        addEventHandler(rc, 'keydown', onkeydown);
       // addEventHandler(cs, 'keydown', onkeydown);
       // addEventHandler(w, 'keydown', onkeydown);
        addEventHandler(n, 'keydown', onkeydown);

        var onsubmitclick = function() {

            if (parseInt(rc.value) > maxrc || rc.value == '' || parseInt(rc.value) == 0)
                rc.value = maxrc;

//            if (parseInt(cs.value) > maxcs || cs.value == '' || parseInt(cs.value) == 0)
//                cs.value = maxcs;

//            if (parseInt(w.value) > maxw || w.value == '' || parseInt(w.value) == 0)
//                w.value = maxw;

            if (parseInt(n.value) > maxn || n.value == '' || parseInt(n.value) == 0)
                n.value = maxn;
            var outstr = 'rc=' + rc.value +
                         '&cs=2' + //cs.value +
                         '&width=' + maxw + //w.value +
                         '&num=' + n.value;
                         
           var height = 80 * n.value / rc.value;

            var re = new RegExp(replacetag, 'g');
            outstr = input.replace(replacetag, outstr);
            
            outstr="<div id=sharealbum></div><script language='javascript' src='" + scurl + "'  type='text/javascript'></script><script language='javascript' type='text/javascript'>" + outstr + "</script>"

            outstr=outstr.replace("<height>",height)
            //选中文本框中的内容；
            var output = document.getElementById('putout');
            output.value = '';
            output.value = outstr;
            setCopy(outstr);
            output.focus();
            output.select();
        }

        var oncancleclick = function() {

            var configdiv = document.getElementById('configdiv');
            document.body.removeChild(configdiv);
        }

        addEventHandler(submit, 'click', onsubmitclick);
        addEventHandler(cancle, 'click', oncancleclick);
    }
    addEventHandler(targeta, 'click', ontgclick);
});


//添加事件监听
function addEventHandler(target, type, func) {
    if (target.addEventListener)
        target.addEventListener(type, func, false);
    else if (target.attachEvent)
        target.attachEvent("on" + type, func);
    else target["on" + type] = func;
}
//移除事件监听
function removeEventHandler(target, type, func) {
    if (target.removeEventListener)
        target.removeEventListener(type, func, false);
    else if (target.detachEvent)
        target.detachEvent("on" + type, func);
    else delete target["on" + type];
}


//获取目标元素当前位置，参考jquery的代码；
var getOffSet = function(element) {
    var div = document.createElement("div");
    div.style.width = div.style.paddingLeft = "1px";

    document.body.appendChild(div);

    var boxModel = div.offsetWidth === 2;
    document.body.removeChild(div).style.display = 'none';
    div = null;
    if ("getBoundingClientRect" in document.documentElement) {
        if (!element) return { top: 0, left: 0 };
        var box = element.getBoundingClientRect(),
            doc = element.ownerDocument,
            body = doc.body,
            docElem = doc.documentElement,
			clientTop = docElem.clientTop
			            || body.clientTop
			            || 0,
		    clientLeft = docElem.clientLeft
			            || body.clientLeft
			            || 0,
             top = box.top + (self.pageYOffset || boxModel && docElem.scrollTop || body.scrollTop) - clientTop,
			left = box.left + (self.pageXOffset || boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
        return { top: top, left: left };
    }
    /*for firefox 3.0以下版本*/
    else {
        if (!element) return { top: 0, left: 0 };
        getOffSet.offset.initialized || getOffSet.offset.initialize();
        var elem = element,
            offsetParent = elem.offsetParent,
            prevOffsetParent = elem,
			doc = elem.ownerDocument,
			computedStyle,
			docElem = doc.documentElement,
			body = doc.body,
			defaultView = doc.defaultView,
			prevComputedStyle = defaultView.getComputedStyle(elem, null),
			top = elem.offsetTop,
			left = elem.offsetLeft;

        while ((elem = elem.parentNode) && elem !== body && elem !== docElem) {
            computedStyle = defaultView.getComputedStyle(elem, null);
            top -= elem.scrollTop,
            left -= elem.scrollLeft;

            if (elem === offsetParent) {
                top += elem.offsetTop,
                left += elem.offsetLeft;

                if (getOffSet.offset.doesNotAddBorder && !(getOffSet.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)))
                    top += parseInt(computedStyle.borderTopWidth, 10) || 0,
					left += parseInt(computedStyle.borderLeftWidth, 10) || 0;
                prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
            }
            if (getOffSet.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible")
                top += parseInt(computedStyle.borderTopWidth, 10) || 0,
				left += parseInt(computedStyle.borderLeftWidth, 10) || 0;
            prevComputedStyle = computedStyle;
        }

        if (prevComputedStyle.position === "relative" || prevComputedStyle.position === "static")
            top += body.offsetTop,
			left += body.offsetLeft;

        if (prevComputedStyle.position === "fixed")
            top += Math.max(docElem.scrollTop, body.scrollTop),
			left += Math.max(docElem.scrollLeft, body.scrollLeft);

        return { top: top, left: left };
    }
}

getOffSet.offset = {
    initialize: function() {
        if (this.initialized) return;
        var body = document.body,
                container = document.createElement('div'),
                innerDiv,
                checkDiv,
                table,
                td,
                rules,
                prop,
                bodyMarginTop = body.style.marginTop,
		        html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';

        rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };

        for (prop in rules) container.style[prop] = rules[prop];

        container.innerHTML = html;
        body.insertBefore(container, body.firstChild);
        innerDiv = container.firstChild,
            checkDiv = innerDiv.firstChild,
            td = innerDiv.nextSibling.firstChild.firstChild;

        this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
        this.doesAddBorderForTableAndCells = (td.offsetTop === 5);

        innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
        this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);

        body.style.marginTop = '1px';
        this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
        body.style.marginTop = bodyMarginTop;
        body.removeChild(container);
        this.initialized = true;
    }
}


//获取事件的来源
function getTargetElement(e) {
    var myself;
    if (window.event) {
        e = window.event;
        myself = e.srcElement;
    } else {
        myself = e.target;
    }
    return myself;
}

//阻止事件冒泡；
function stopBubble(e) {
    //如果提供了事件对象，则这是一个非IE浏览器
    if (e && e.stopPropagation)
    //因此它支持W3C的stopPropagation()方法
        e.stopPropagation();
    else
    //否则，我们需要使用IE的方式来取消事件冒泡
        window.event.cancelBubble = true;
}

//阻止浏览器默认行为；
function stopDefault(e) {
    //阻止默认浏览器动作(W3C)
    if (e && e.preventDefault)
        e.preventDefault();
    //IE中阻止函数器默认动作的方式
    else
        window.event.returnValue = false;
    return false;
}

//访问剪切板 http: //blog.163.com/shldxj@126/blog/static/84354390200910282184395/
//firefox 3.5.3下无效
function setCopy(_sTxt) {

    if (window.clipboardData) {
        window.clipboardData.setData("Text", _sTxt);
    } else {
        if (window.netscape) {
            try {
                netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
                var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
                if (!clip) {
                    return;
                }
                var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
                if (!trans) {
                    return;
                }
                trans.addDataFlavor("text/unicode");
                var str = new Object();
                var len = new Object();
                var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
                var copytext = maintext;
                str.data = copytext;
                trans.setTransferData("text/unicode", str, copytext.length * 2);
                var clipid = Components.interfaces.nsIClipboard;
                if (!clip) {
                    return false;
                }
                clip.setData(trans, null, clipid.kGlobalClipboard);
                return true;
            }
            catch (e) {
               // alert("firefox复制到剪切板失败，请收动粘贴参数");
                return false;
            }
        }
    }
    return false;

}
