Runner2k11 / Redesign OBI IT Catalogue

// ==UserScript==
// @name        Redesign OBI IT Catalogue
// @author      Aleksey Bagrov OBI 016
// @description Редизайн ОБИ ИТ каталога
// @include     http://svrua000047.de.obi.net/
// @include     http://svrua000047.de.obi.net/#
// @include     http://svrua000047.de.obi.net/MainTaskForm.aspx*
// @include     http://svrua000047.de.obi.net/subforms/ShopPage.aspx*
// @include     http://svrua000047.de.obi.net/subforms/CartGrid.aspx*
// @downloadURL	https://openuserjs.org/install/Runner2k11/Redesign_OBI_IT_Catalogue.user.js
// @updateURL	https://openuserjs.org/install/Runner2k11/Redesign_OBI_IT_Catalogue.user.js
// @grant       none
// @version     1.13
// @license     MIT
// ==/UserScript==


var scriptVersion = '1.13';

var ButtonAddWidth = '220px';
//              1        2        3      4       5       6      7      8               9
var ColWidth = ['120px', '450px', '0px', '85px', '40px', '0px', '0px', ButtonAddWidth, '90px']
//1 Артикул
//2 Описание полное
//3 Контрагент
//4 Цена за ед.
//5 Валюта
//6 ОБИ (DE) Артикул товара
//7 Фото
//8 Корзина
//9 Стоимость
//0px - не отображать столбик
var ColWidthLen = ColWidth.length - 1;
var CatPosButtonAdd = ColWidth.indexOf(ButtonAddWidth);

var CatButtons = ['ИТ расходка', '355', 'ИТ оборудование', '354']

var getFooter;
var i, j;
var elems, elems2;
var FirstCol;

var FrameHeight=850;
var FrameWidth=0;
for (i = 0; i < ColWidth.length; i++) {
    FrameWidth += parseInt(ColWidth[i]);
}
FrameWidth += 20;
ColWidth[1] = '100%';



//добавить скрипт на страницу
function AppendScript(s) {
	document.head.appendChild(document.createElement('script'))
		.innerHTML = s.toString().replace(/^function.*{|}$/g, '');
}



function ChangeCellsView() {
	//меняем общую ширину таблицы
	elems = document.getElementById('CartRadGrid');
	if (elems) elems.style.width="100%";
	//
	getFooter = document.getElementById('CartRadGrid_ctl00');
	if (getFooter) {
		elems = getFooter.getElementsByTagName('th');
		i = 0;
		while((i < elems.length)&&(elems[i].getAttribute('title').toLowerCase().indexOf('vendors article') == -1)){
			i++;
		}
		FirstCol = (i < elems.length) ? i : 0;
		//меняем colgroup
		elems = getFooter.getElementsByTagName('col');
		for (i=0; i<=ColWidthLen; i++) if (ColWidth[i] != '0px') {
				elems[i+FirstCol].style.width = ColWidth[i];
			} else {
				elems[i+FirstCol].style.display = 'none';
			}
		//меняем заголовки
		elems = getFooter.getElementsByTagName('thead')[0].getElementsByTagName('th');
		for (i = 0; i < elems.length; i++) if (ColWidth[i] == '0px') elems[i+FirstCol].style.display = 'none';
		//меняем поиск
		elems = getFooter.getElementsByTagName('thead')[0].getElementsByClassName('rgFilterRow')[0].getElementsByTagName('td');
		for (i = 0; i < elems.length; i++) if (ColWidth[i] == '0px') elems[i+FirstCol].style.display = 'none';
		elems[ColWidthLen+FirstCol].innerHTML = '<span id="RedCatTotalSumm" style="font-weight: bold; color: red;">' + GetTotalSumm() + '</span>';
		elems[ColWidthLen+FirstCol].setAttribute('align', 'right');
		//меняем ячейки
		i=0;
		do {
		elems = document.getElementById('CartRadGrid_ctl00__' + i);
		if (elems) {
				elems = elems.getElementsByTagName('td');
				if (elems) {
					elems[3+FirstCol].setAttribute('align', 'right');
					elems[CatPosButtonAdd+FirstCol].setAttribute('align', 'right');
					//elems[7+FirstCol].setAttribute('valign', 'middle');
					//удаляем дивы с мин кол-вом заказа и поставки
					elems2 = elems[CatPosButtonAdd+FirstCol].getElementsByTagName('div'); //.getElementsByClassName('dMinVal')[0];
					if (elems2.length == 2) {
						if (elems2[0].innerHTML.indexOf(': 1шт.') != -1) {
							elems2[0].parentNode.removeChild(elems2[0]);
							elems2[0].parentNode.removeChild(elems2[0]);
						}
					}
					for (j = 0; j < elems.length; j++) {
						if (ColWidth[j] == '0px') elems[j+FirstCol].style.display = 'none';
					}
					i++;
				}
			}
		} while (elems);
	}
}


//меняем размер фрейма каталога (динамически)
function ChangeFrameSize() {
	$(document).ready(function() {
		resizeiFrames();
		window.getHeight = function(id) {
			return FrameHeight;
		};
	});

	$(window).on("resize", function () {
		resizeiFrames();
	});

	function resizeiFrames() {
		$("iframe").each(function () {
			if ((this.id == 'iCatalog') || (this.id == 'iCart')) {
				var self = this;
				$(this.contentWindow.document).ready(function () {
					$(self).height(FrameHeight - 30);
					$(self).width($(this).width() - $(self).offset().left - 5);
					if (FrameWidth > 0 && (FrameWidth >= $(this).width() - $(self).offset().left - 5)) {
						$(self).attr("horizontalscrolling", "yes");
						$(self).height($(self).height() - 26);
					}
				});
			}
		});
	}

}


//добавляем кнопки принудительного переключения на "ИТ оборудование" и "Расходка"
function AddOverrideCatButton() {
    elems = document.getElementById('pvCatalog');
    if (elems) {
    	elems = elems.appendChild(document.createElement('div'));
		with(elems.style) {
			position = 'absolute';
			top = '50px';
			left = '300px';
		}
		elems.innerHTML =
		//elems = elems.getElementsByClassName('dSelectSubcat');
        //elems.innerHTML +=
            '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Принудительное переключение ' +
            '<input type="button" value="' + CatButtons[0] + '" title="Принудительно переключить на \'' + CatButtons[0] + '\'" tabindex="-1" onclick="document.getElementById(\'iCatalog\').src=document.getElementById(\'iCatalog\').src.replace(/(SubcatID=)(\\d+)/i,\'$1' + CatButtons[1] + '\');return false"></input>' +
            '&nbsp;<input type="button" value="' + CatButtons[2] + '" title="Принудительно переключить на \'' + CatButtons[2] + '\'" tabindex="-1" onclick="document.getElementById(\'iCatalog\').src=document.getElementById(\'iCatalog\').src.replace(/(SubcatID=)(\\d+)/i,\'$1' + CatButtons[3] + '\');return false"></input>';
    }
}


//расширяем фрейм накладных
function ChangeDeliveryNoteFrame() {
	elems = document.getElementById('ep3239iframe');
	if (elems) elems.width = "108%";
}

//меняем способ отображения каталога на дочернее окно
function ChangeCatView() {
	elems = document.getElementById('InlineExtFormsItem0');
	if (elems) {
		//меняем общую ширину таблицы
		//elems.style.width=FrameWidth + "px";
		elems = elems.getElementsByClassName('InlineExtFormsName');
		if (elems) {
			elems = elems[0];
			var hrefCatalogue = elems.href;
			elems = document.getElementById('ctl00_formInner_Contenttd').getElementsByTagName("a");
			for (i=0; i<elems.length; i++) {
				if (elems[i].href.toLowerCase().indexOf('shoppage.aspx') != -1) {
					elems[i].parentNode.parentNode.innerHTML = //'>>> КАТАЛОГ  <<<';
    					'<a class="aBlueBtn" href="javascript:;" onclick="' +
						'window.open(\'' + elems[i].href + '\',\'ИТ Каталог\',' +
						//'openWindowWithPostRequest(\'' + elems[i].href + '\',\'ИТ Каталог\',' +
						'\'left=' + ((screen.width - FrameWidth) / 2) +
						',top=' + ((screen.height - FrameHeight - 50) / 2) +
						',height=' + FrameHeight +
						',width=' + FrameWidth +
						'\').focus()">' +
						//'\')">' +
						'<table class="BlueBtn" cellspacing="0" cellpadding="0" onmouseout="Sys.UI.DomElement.removeCssClass(this, \'BlueBtnH\')" onmouseover="Sys.UI.DomElement.addCssClass(this,\'BlueBtnH\')" style="width:" tstchangeconfirmtext="" attrs="" title="Открыть окно заказа">' +
						'<tbody><tr><td class="BlueBtnLeftCorner"></td>' +
						'<td class="BlueBtnText"><span style="font-weight: bold; color: rgb(51, 102, 153);">&nbsp;&nbsp;&nbsp; Каталог &nbsp;&nbsp;&nbsp;</span></td>' +
						'<td class="BlueBtnRightCorner"></td>' +
						'</tr></tbody></table>' +
						'</a>';
				} else if (elems[i].href.toLowerCase().indexOf('taskprintform.aspx') != -1) {
				    //попутно красиво оформляем карточку согласования
				    elems[i].parentNode.style.paddingLeft='2px';
				    elems[i].innerHTML =
						'<table class="BlueBtn" cellspacing="0" cellpadding="0" onmouseout="Sys.UI.DomElement.removeCssClass(this, \'BlueBtnH\')" onmouseover="Sys.UI.DomElement.addCssClass(this,\'BlueBtnH\')" style="width:" tstchangeconfirmtext="" attrs="" title="Открыть карточку согласования">' +
						'<tbody><tr><td class="BlueBtnLeftCorner"></td>' +
						'<td class="BlueBtnText"><span style="font-weight: bold; color: rgb(51, 102, 153);">&nbsp;&nbsp;&nbsp; ' + elems[i].innerHTML + ' &nbsp;&nbsp;&nbsp;</span></td>' +
						'<td class="BlueBtnRightCorner"></td>' +
						'</tr></tbody></table>';
					elems[i].setAttribute('class','aBlueBtn');
				} else if (elems[i].href.toLowerCase().indexOf('createmailpr') != -1) {
					//и "письмо контрагенту" тоже красивенько делаем
				    elems[i].innerHTML =
						'<table class="BlueBtn" cellspacing="0" cellpadding="0" onmouseout="Sys.UI.DomElement.removeCssClass(this, \'BlueBtnH\')" onmouseover="Sys.UI.DomElement.addCssClass(this,\'BlueBtnH\')" style="width:" tstchangeconfirmtext="" attrs="" title="Открыть карточку согласования">' +
						'<tbody><tr><td class="BlueBtnLeftCorner"></td>' +
						'<td class="BlueBtnText"><span style="font-weight: bold; color: rgb(51, 102, 153);">&nbsp;&nbsp;&nbsp; ' + elems[i].innerHTML + ' &nbsp;&nbsp;&nbsp;</span></td>' +
						'<td class="BlueBtnRightCorner"></td>' +
						'</tr></tbody></table>';
					elems[i].setAttribute('class','aBlueBtn');
				}					
			}
		}
	}
	//удаляем фрейм каталога
	elems = document.getElementById('Catalogue');
	if (elems) elems.parentNode.removeChild(elems);
}


function openCatalogWithPost() {
	function openWindowWithPostRequest(winURL, winName, windowoption) {
	  var params = { '__EVENTARGUMENT' : 'FireCommand:CartRadGrid$ctl00;PageSize;20' , '__EVENTTARGET' : 'CartRadGrid' };         
	  var form = document.createElement("form");
	  form.setAttribute("method", "post");
	  form.setAttribute("action", winURL);
	  form.setAttribute("target",winName);  
	  for (var i in params) {
		if (params.hasOwnProperty(i)) {
		  var input = document.createElement('input');
		  input.type = 'hidden';
		  input.name = i;
		  input.value = params[i];
		  form.appendChild(input);
		}
	  }              
	  document.body.appendChild(form);                       
	  window.open('', winName,windowoption);
	  form.target = winName;
	  form.submit();                 
	  document.body.removeChild(form);           
	}
}


function RedCatNewScript() {

	function OnCartSuccess(res, amountWrapper) {
		if (amountWrapper != null) {
			amountWrapper.set_value(0);
		}

		if (res != null) {
			if (res.indexOf("rebindCart") > -1)
				window.parent.needRebindCart = true;

			if (res.indexOf("rebindCatalog") > -1) {
				window.parent.needRebindCatalog = true;
				if (!isShopCart)
					RebindCatalog();
			}

			if (res.indexOf("enableSelectSubcat") > -1) {
				window.parent.$find($(window.parent.document).contents().find("#ddlSelectSubcat").prop('id')).set_enabled(true);
			} else if (res.indexOf("disableSelectSubcat") > -1) {
				window.parent.$find($(window.parent.document).contents().find("#ddlSelectSubcat").prop('id')).set_enabled(false);
			}
		}

		if (!isShopCart)
			alert(Constants.ShopCart.CartMsgItemAddSuccess);
		else
			alert(Constants.ShopCart.CartMsgItemSetSuccess);

		//обновляем общую сумму в родительском окне, а не в фрейме
		(new window.parent.opener.ExtParam(TotalSummEPID)).update();    //MainTaskForm.aspx
	}

	function GetTotalSumm() {
		var masterTable = $find("CartRadGrid").get_masterTableView();
		var count = masterTable.get_dataItems().length;
		var item;
		var summ = 0;
		for (var i = 0; i < count; i++) {
			item = masterTable.get_dataItems()[i];
			summ = parseFloat(summ) + parseFloat(item.get_cell("TotalPrice").innerHTML.replace(",", "."));   //!!!фикс неправильной суммы
			summ = Math.round(summ * 100) / 100;
		}
		return summ;
	}

    $.fn.getRowId = function() {
		//меняем общую сумму
		setTimeout('var elems = document.getElementById(\'RedCatTotalSumm\');if (elems) elems.innerHTML = GetTotalSumm();', 100);
		return this.closest("tr")[0].id.split("__")[1];
	};
}


function SetupBanner() {
    elems= document.body.appendChild(document.createElement('div'));
    if (elems) {
        elems.id = 'RedCatBanner';
        elems.innerHTML +=
            //'<div style="position: fixed; bottom: 1%; left: 1%; background-color: #A0D0F0; ' +
            '<div style="position: fixed; top: 3px; left: 660px; background-color: #A0D0F0; ' +
            'box-shadow: inset 0 0 0 1px rgba(255,255,255,0.5), 0 3px 6px -3px rgba(0,0,0,0.25); ' +
            'text-shadow: 0 2px 2px rgba(255,255,255,1); ' +
            'border: 1px dashed #6090B0; border-radius: 7px; padding: 3px; text-align:center;">' +
            //'<span style="font-size: 12px; font-weight: bold; color: red;">' +
            '<span style="font-size: 10px; font-weight: bold; color: red;">' +
            'Redesign<br>OBI IT<br>Catalogue v' + scriptVersion +
            '</span></div>';
	}
}

//меняем ширину панели навигации на 300px, если ширина не установлена или установлена по умолчанию 
function SetWidth_navigationPane() {
	i = window.findCookie(window.Constants.Default.TreeWidthCookieName);
	if ((i == null)||(i == window.Constants.Default.LeftTreesPinnedDefaultWidth)) {
		i = 300;
		window.addCookie(window.Constants.Default.TreeWidthCookieName, i, 900);
		window.$find('navigationPane').resize(i - window.Constants.Default.LeftTreesPinnedDefaultWidth, 1);
		openDef();
	}
}

//раскрываем "дерево" навигации, открываем "Заявки на закупку ИТ" по умолчанию
function openDef() {
	TCLeftTrees.openSyndicate('?PID=272&force=grid&wiki=False');
	//TCLeftTrees.openNodeForSyndicate(80,'?iscat=true&PID=80&force=grid');
	//setTimeout(function () { TCLeftTrees.openNodeForSyndicate(81,'?iscat=true&PID=81&force=grid') }, 3000);
	openNode(80,'?iscat=true&PID=80&force=grid');
	setTimeout(function () { openNode(81,'?iscat=true&PID=81&force=grid') }, 3000);
}

function openNode(catID, subcatID, fileBrowserTree) {
	var treeId = fileBrowserTree ? TCLeftTrees.TreeFilesClientID : TCLeftTrees.TreeTasksClientID;
	var nodeVal = catID ? TCLeftTrees.CatNodePrefix + catID : TCLeftTrees.SubcatNodePrefix + subcatID;
	var node = $find(treeId).findNodeByValue(nodeVal);
	if (!node.get_expanded()) {
		node.set_expanded(true);
		TCLeftTrees.addTreeCookie(node.get_value());
	}
}


$(document).ready(function() {
    var href_locase = window.location.href.toLowerCase();
	if (href_locase.indexOf("maintaskform.aspx") != -1) {
		//AppendScript(openCatalogWithPost);
		ChangeCatView();
		ChangeDeliveryNoteFrame();
	} else if (href_locase.indexOf("shoppage.aspx") != -1) {
		ChangeFrameSize();
		AddOverrideCatButton();
	} else if (href_locase.indexOf("cartgrid.aspx") != -1) {
		AppendScript(RedCatNewScript);
		ChangeCellsView();
	} else if (window.location.href == 'http://svrua000047.de.obi.net/') {
		SetWidth_navigationPane();
		SetupBanner();
		//openDef();
	}
});