crm finder

查找 CRM 指定的元素,闪烁展示

// ==UserScript==
// @name         crm finder
// @name:zh-CN   CRM查找器
// @namespace    http://tampermonkey.net/
// @version      0.1.3
// @description  查找 CRM 指定的元素,闪烁展示
// @description:zh-cn  查找 CRM 指定的元素,闪烁展示
// @author       [email protected]
// @include      http*://crm3.sc.ctc.com*/*
// @require      http://libs.baidu.com/jquery/1.8.3/jquery.min.js
// @require      https://libs.baidu.com/jqueryui/1.10.4/jquery-ui.min.js
// @grant  GM_addStyle
// ==/UserScript==

(function() {
	'use strict';
	//$("[type='button'][class='btn btn-primary btn-sm okbutt']")

	var GLOBAL_ELEMENTS = [];  // 改一下,存 json 对象
	var GLOBAL_PARENTS = [];
	var GLOBAL_CLICK_NUM = 0; // 放大点了多少次

	var zNode = document.createElement('div');
	var doc_title = document.title;
	if(doc_title.indexOf('登录') != -1 || doc_title.indexOf('门户') != -1) {
		return;
	}
	//	zNode.innerHTML = '<button id="myButton" type="button">' +
	//		'For Pete\'s sake, don\'t click me!</button>';
	zNode.innerHTML = '<div id="digTitle">[' + doc_title + '] 拖这里</div><div><input id="myInput" type="text"></input><div><div class="myBetween"><button id="myButton" type="button">一件复原</button><button id="mySearchButton" type="button">搜寻(回车)</button></div><div>没有闪烁?可能被隐藏,试着放大找父级 <button id="myZoomIn">+</button></div>';
	zNode.setAttribute('id', 'myContainer');
	//	zNode.setAttribute('class', 'myContainer');
	document.body.appendChild(zNode);

	//$('#myContainer').draggable({ scroll: true, scrollSensitivity: 100 });

	document.getElementById("myInput").addEventListener(
		"keyup", inputClickAction, false
	);

	document.getElementById("myButton").addEventListener(
		"click", buttonClickAction, false
	);

	document.getElementById("myZoomIn").addEventListener(
		"click", zoomInClickAction, false
	);

	document.getElementById("mySearchButton").addEventListener(
		"click", searchButtonAction, false
	);

	function searchButtonAction(e) {
		var vector = document.getElementById('myInput').value; // 从哪里来的
		try {
			searchByAttrs(vector);
		} catch(e) {
			warn_prompt('没找着', 3000);
		}
	}

	function zoomInClickAction(e) {
		$(GLOBAL_ELEMENTS).each(function(index, item) { // Now the item means Map<Element,Display>
//			$(item).removeClass("headerBox"); // 先清除本身
//			$(item.parentElement).addClass("headerBox");
//			GLOBAL_ELEMENTS[index] = item.parentElement; // 用父类替代

			var disp = item.display;
			var ele = item.elementObj;
			$(ele).removeClass("headerBox");  // cancel flash
			if(disp == 'none'){
				$(ele).css("display",disp); // 还原 none 的 display
			}

			var parentObj = ele.parentElement; // 用父类替代
			var parentDisp = $(parentObj).css("display");

			$(parentObj).addClass("headerBox"); // 在父类上加效果

			if(parentDisp == 'none'){ // Parent if none then display it
				$(parentObj).css("display","block");
			}

			var ele_disp_map = {  // A map which store element and it's display attributes
				"elementObj" : parentObj,
				"display" : parentDisp
			}

			GLOBAL_ELEMENTS[index] = ele_disp_map;

		});

		GLOBAL_CLICK_NUM++;

		warn_prompt('放大了 '+GLOBAL_CLICK_NUM+' 次',8000);

	}

	function zoomOutClickAction(e) {}

	/**
	 * 一键清除
	 * @param {Object} e
	 */
	function buttonClickAction(e) {

		GLOBAL_ELEMENTS.forEach(function(item, index) { // Now the item means Map<Element,Display>
			// $(item).removeClass("headerBox");
			var disp = item.display;
			var ele = item.elementObj;
			$(ele).removeClass("headerBox");  // cancel flash
			if(disp == 'none'){
				$(ele).css("display",disp); // 还原 none 的 display
			}
		});

		GLOBAL_ELEMENTS = []; // clear
		GLOBAL_CLICK_NUM = 0; // zero
	}

	function inputClickAction(e) {
		var event = e || window.event;
		var key = event.which || event.keyCode || event.charCode;
		if(key == 13) {
			//alert('回车');
			// searchDebug();
			var vector = document.getElementById('myInput').value; // 从哪里来的
			try {
				searchByAttrs(vector);
			} catch(e) {
				warn_prompt('没找着', 3000);
			}

		}
	}

	function searchDebug() {
		debugger;
	}

	/**
	 * 用 all attributes 来查找,注意,返回的是一个数组
	 */
	function searchByAttrs(vector) {
		var attrs = getAttributes(vector);
		var searchKey = "";
		for(var i = 0; i < attrs.length; i++) {
			if(attrs[i] != '') {
				var kv = attrs[i].split('='); // k=v
				searchKey = searchKey + '[' + kv[0] + '=\'' + kv[1] + '\']';
			}
		}
		console.log(searchKey);
		var objs = $(searchKey);
		var foundNums = objs.length;
		success_prompt('一共找到: ' + foundNums + ' 个元素', 3000);
		objs.each(function(index, ele) {
			var disp_option = $(ele).css('display'); // Notice that option 'block' is a default value
			var ele_disp_map = {  // A map which store element and it's display attributes
				"elementObj" : ele,
				"display" : disp_option
			}
			//GLOBAL_ELEMENTS.push(ele);
			GLOBAL_ELEMENTS.push(ele_disp_map);
			if(disp_option == 'none'){ // if none then display it
				$(ele).css("display","block");
			}
			$(ele).addClass("headerBox"); // flash
		});
	}

	function getAttributes(vector) {
		var str = getAttributesFromVector(vector); // [type=button;class=btn btn-primary btn-sm okbutt;]
		var pureStr = str.substr(1, str.length - 2); // 去除 []  type=button;class=btn btn-primary btn-sm okbutt;
		var attrs = pureStr.split(";");
		var pureAttrs = [];
		for(var i = 0; i < attrs.length - 1; i++) { // 最后一个空的不放进去
			pureAttrs.push(attrs[i]);
		}
		return pureAttrs;
	}

	function getAttributesFromVector(vector) {
		var arr = splitVector(vector);
		var attrStr = arr[8];
		return attrStr;
	}

	function splitVector(vector) {
		return vector.split("||");
	}

	//--- Style our newly added elements using CSS.
	GM_addStyle(multilineStr(function() {
		/*!
		    #myContainer {
		     position:    absolute;
		     top:     0;
		     left:     0;
		     font-size:    20px;
		     background:    orange;
		     border:     3px outset black;
		     margin:     5px;
		     opacity:    0.9;
		     z-index:    1222;
		     padding:    5px 20px;
		     float:	left;
		    }
		    #myButton {
		     cursor:     pointer;
		     margin:	5px;
		    }
		    #myContainer p {
		     color:     red;
		     background:    white;
		    }

		    #myZoomIn {
		    	margin:	5px;
		    }

		    #myInput {
		    	border:	none;
		    	width: 400px;
		    	margin:	5px;
		    }

		    .myBetween {
		    	display: flex;
    			justify-content: space-between;
		    }

		    .myBetween button {
		    	cursor:     pointer;
		     	margin:	5px;
		    }

		    .class_lu {
		        background-color: rgba(130, 180, 230, 0.5);
		        box-sizing: border-box;
		        outline: solid 1px #0F4D9A;
		        cursor: default;
		    }

		    @keyframes fade {
			    from {
			        opacity: 1.0;
			    }
			    50% {
			        opacity: 0.4;
			    }
			    to {
			        opacity: 1.0;
			    }
			}

			@-webkit-keyframes fade {
			    from {
			        opacity: 1.0;
			    }
			    50% {
			        opacity: 0.4;
			    }
			    to {
			        opacity: 1.0;
			    }
			}
			.headerBox {
			    color: #fff;
			    padding: 10px;
			    font-size: 15px;
			    height: 60px;
			    animation: fade 600ms infinite;
			    -webkit-animation: fade 600ms infinite;
			}

			.alert {
			    display: none;
			    position: fixed;
			    top: 50%;
			    left: 50%;
			    min-width: 200px;
			    margin-left: -100px;
			    z-index: 99999;
			    padding: 15px;
			    border: 1px solid transparent;
			    border-radius: 4px;
			}

			.alert-success {
			    color: #3c763d;
			    background-color: #dff0d8;
			    border-color: #d6e9c6;
			}

			.alert-info {
			    color: #31708f;
			    background-color: #d9edf7;
			    border-color: #bce8f1;
			}

			.alert-warning {
			    color: #8a6d3b;
			    background-color: #fcf8e3;
			    border-color: #faebcc;
			}
		*/
	}));

	function multilineStr(dummyFunc) {
		var str = dummyFunc.toString();
		str = str.replace(/^[^\/]+\/\*!?/, '') // Strip function() { /*!
			.replace(/\s*\*\/\s*\}\s*$/, '') // Strip */ }
			.replace(/\/\/.+$/gm, '') // Double-slash comments wreck CSS. Strip them.
		;
		return str;
	}

	var Dragging = function(validateHandler) { //参数为验证点击区域是否为可移动区域,如果是返回欲移动元素,负责返回null
		var draggingObj = null; //dragging Dialog
		var diffX = 0;
		var diffY = 0;

		function mouseHandler(e) {
			switch(e.type) {
				case 'mousedown':
					draggingObj = validateHandler(e); //验证是否为可点击移动区域
					if(draggingObj != null) {
						diffX = e.clientX - draggingObj.offsetLeft;
						diffY = e.clientY - draggingObj.offsetTop;
					}
					break;

				case 'mousemove':
					if(draggingObj) {
						draggingObj.style.left = (e.clientX - diffX) + 'px';
						draggingObj.style.top = (e.clientY - diffY) + 'px';
					}
					break;

				case 'mouseup':
					draggingObj = null;
					diffX = 0;
					diffY = 0;
					break;
			}
		};

		return {
			enable: function() {
				document.addEventListener('mousedown', mouseHandler);
				document.addEventListener('mousemove', mouseHandler);
				document.addEventListener('mouseup', mouseHandler);
			},
			disable: function() {
				document.removeEventListener('mousedown', mouseHandler);
				document.removeEventListener('mousemove', mouseHandler);
				document.removeEventListener('mouseup', mouseHandler);
			}
		}
	}

	function getDraggingDialog(e) {
		var target = e.target;
		//		while(target && target.className.indexOf('dialog-title') == -1) {
		while(target && target.id != 'digTitle') {
			target = target.offsetParent;
		}
		if(target != null) {
			return target.offsetParent;
		} else {
			return null;
		}

	}

	Dragging(getDraggingDialog).enable();

	var prompt = function(message, style, time) {
		style = (style === undefined) ? 'alert-success' : style;
		time = (time === undefined) ? 1200 : time;
		$('<div>')
			.appendTo('body')
			.addClass('alert ' + style)
			.html(message)
			.show()
			.delay(time)
			.fadeOut();
	};

	var success_prompt = function(message, time) {
		prompt(message, 'alert-success', time);
	};

	var warn_prompt = function(message, time) {
		prompt(message, 'alert-warning', time);
	};

})();