//////////////// Расширенные функции ////////////////
function $() {
	//var isDOMTmp = (isDOM==undefined) ? false : true ;
	var isDOMTmp = (document.getElementById) ? true : false ;
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			//element = document.getElementById(element);
			element = (isDOMTmp) ? document.getElementById(element) : document.all[element] ;
		}
		if (arguments.length == 1) return element;
		elements.push(element);
	}
	return elements;
}


/*
Функция getElementsByClass выбирает элементы по имени класса, и к удивлению разработчиков, она не является настоящим методом DOM, 
как они могли бы подумать. в конце концов, есть getElementById, getElementsByName(), getElementsByTagName, куда, к чертям, делась getElementsByClass?
*/
function getElementsByClass (searchClass, tag, node) {
	//alert('searchClass= '+searchClass);
	//alert('searchClass= '+searchClass+', node= '+node+', tag= '+tag);
	var classElements = new Array();
	if (node==undefined || node==null || node=='') node = document;
	if (tag==undefined || tag==null || tag=='') tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	/*var pattern = new RegExp(\"(^|\\s)\"+searchClass+\"(\\s|$)\");*/
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


/*
Конечно же, скрепка для прикрепления события! Плюс несколько незначительных синтаксических правок. 
вот оригинал, с которого всё началось: http://www.dustindiaz.com/rock-solid-addevent/
Пример:
addEvent(window,’load’,func1,false);
addEvent(window,’load’,func2,false);
*/
function addEvent (elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType] = fn;
	}
}


/*
Изначально написанная Саймоном Виллисоном (Simon Willison: http://simon.incutio.com/archive/2004/05/26/addLoadEvent)
Простой способ добавить события, запускающиеся после загрузки страницы.
Функция прикрепляет все ваши события к обработчику события onload.
Пример:
addLoadEvent(func1);
addLoadEvent(func2);
*/
function addLoadEvent (func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}


/*Вычисляем значение свойства элемента, заданое в CSS свойстве через тэг <STYLE></STYLE> или внешние листы стилей, а не инициализировано через скрипт*/
function getElementComputedStyle (elem, prop) {
  if (typeof elem!="object") elem = $(elem);
  // external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
  if (document.defaultView && document.defaultView.getComputedStyle)
  {
    if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
    return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
  }
  // external stylesheet for Explorer and Opera 9
  if (elem.currentStyle)
  {
    var i;
    while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
    return elem.currentStyle[prop];
  }
  return "";
}

//////////////// Расширенные функции - END ////////////////




// сдвигает скроллинг к нужному объекты по вертикали
function scrollToObj (obj) {
	//alert('typeof(objId)= '+typeof(objId));
	if (typeof obj!='object') obj = $(obj);
	if (obj!=undefined && obj.offsetTop!=undefined) {
		var currentYPos = 0;
		var step = 10;
		if (document.body && document.body.scrollTop) currentYPos = document.body.scrollTop;
		else if (document.documentElement && document.documentElement.scrollTop) currentYPos = document.documentElement.scrollTop;
		else if (window.pageYOffset) currentYPos = window.pageYOffset;
		//alert('currentYPos= '+currentYPos);
		objYPos = obj.offsetTop;
		//alert('objYPos= '+objYPos);
		if (objYPos>currentYPos) {
			if ((objYPos-currentYPos)>400) step = 30;
			for(i=currentYPos;i<=objYPos;i+=step) {
				window.scrollTo(0,i);
				if ((objYPos-i)<=200) step = 10;
				if ((objYPos-i)<=70) step = 3;
				if ((objYPos-i)<=20) step = 1;
			}
		} else if (objYPos<currentYPos) {
			if ((currentYPos-objYPos)>400) step = 30;
			for(i=currentYPos;i>=objYPos;i-=step) {
				window.scrollTo(0,i);
				if ((i-objYPos)<=200) step = 10;
				if ((i-objYPos)<=70) step = 3;
				if ((i-objYPos)<=20) step = 1;
			}
		}
	}
}


// изменяет нужное свойство объекта на новое, старое при этом сохраняет в виде `pName+Original` атрибута тега
function chObjPart (obj, pName, pNew) {
	//var obj = $(objId);
	if (typeof obj!='object') var obj = $(obj);
	if (obj!=undefined) {
		var objAttrOrig = obj.getAttribute(pName+'Original');
		var objAttrStyleOrig = getElementComputedStyle(obj,pName);
		if (objAttrOrig==undefined || objAttrOrig==null) {
			obj.setAttribute(pName+'Original',objAttrStyleOrig);
			objAttrOrig = obj.getAttribute(pName+'Original');
		}
		obj.style[pName] = (objAttrOrig==objAttrStyleOrig) ? pNew : objAttrOrig ;
	}
}


function printit() {
	var browser_name = navigator.appName;
	if (browser_name == "Netscape") {
		window.print();
		//window.close();
	} else {
		var WebBrowser = '<object id="WebBrowser1" width=0 height=0 classid="clsid:8856F961-340A-11D0-A96B-00C04FD705A2"></object>';
		document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
		WebBrowser1.ExecWB(6,2);
		//window.close();
	}
}


// передаем обект поля для ввода и текст. Ф-ия срабатывает по событиям "onfocus()" и "onblur()". Возвращает текст или ничего.
function inputReplace (obj, v) {
	if (obj.value=='') obj.value = v;
	else if (obj.value==v) obj.value = '';
}

var wlJs = {
	//////////////// Полезные функции, PHP-аналоги и др. ////////////////
	// Return part of a string
	substr : function (f_string, f_start, f_length) {
		if(f_start < 0) f_start += f_string.length;
		if(f_length == undefined) f_length = f_string.length;
		else if(f_length < 0) f_length += f_string.length;
		else f_length += f_start;
		if(f_length < f_start) f_length = f_start;
		return f_string.substring(f_start, f_length);
	},
	trim : function (str, sep) {
		if (typeof sep=='undefined') sep = '';
		return str.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, sep);
	}
}

