//////////////// Расширенные функции ////////////////
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 (obj==undefined) obj = document.body;
	if (typeof obj!='object') obj = $(obj);
	//alert('obj.offsetTop= '+obj.offsetTop);
	if (obj!=undefined && obj.offsetTop!=undefined) {
		var currentYPos = 0;
		var step = 40;
		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);
		
		//window.scrollTo(0,0);
		if (objYPos>currentYPos) {
			if ((objYPos-currentYPos)>400) stepNow = step*3;
			for(i=currentYPos;i<=objYPos;i+=stepNow) {
				window.scrollTo(0,i);
				if ((objYPos-i)<=200) stepNow = step;
				if ((objYPos-i)<=70) stepNow = step/3;
				if ((objYPos-i)<=20) stepNow = step/10;
			}
		} else if (objYPos<currentYPos) {
			//if ((currentYPos-objYPos)>400) stepNow = step*3;
			if ((currentYPos-objYPos)>40) stepNow = step*3;
			for(i=currentYPos;i>=objYPos;i-=stepNow) {
				window.scrollTo(0,i);
				if ((i-objYPos)<=200) stepNow = step;
				if ((i-objYPos)<=70) stepNow = step/3;
				if ((i-objYPos)<=20) stepNow = step/10;
			}
		}
	}
}


// изменяет нужное свойство объекта на новое, старое при этом сохраняет в виде `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 wl = {
	//////////////// Полезные функции, 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 (str!=undefined) {
			//if (typeof sep=='undefined') sep = ' \s\xA0';
			sep = !sep ? ' \\s\\xA0' : sep.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
			//return str.replace(/^\s+/, '').replace(/\s+$/, ''); // Только для пробелов!
			return str.replace(new RegExp('^['+sep+']+|['+sep+']+$','g'), '');
		}
	},
	bin2hex : function (s) { // Convert binary data into hexadecimal representation // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // Пример: bin2hex('Kev'); Результат: '4b6576'
		var i, f = s.length, a = [];
		for(i = 0; i<f; i++){
			a[i] = s.charCodeAt(i).toString(16);
		}
		return a.join('');
	},
	//spamfuck: function (str) {
		//if (typeof sep=='undefined') sep = '';
		//return str.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, sep);
	//}
	// Генератор строк (паролей)
	// <a href="#" onclick="wl.showPass(); return false;">Придумать хороший пароль</a>
	randString : {
		len : 8,
		mtRand : function (min, max) {
			var range = max - min + 1;
			var n = Math.floor(Math.random() * range) + min;
			return n;
		},
		showPass : function () {
			prompt('Рекомендуемый пароль:', this.mkPass(this.mtRand(10, 14)));
		},
		mkPass : function (len) {
			var len=len?len:this.len;
			var pass = '';
			var rnd = 0;
			var c = '';
			for (i = 0; i < len; i++) {
				rnd = this.mtRand(0, 2); // Латиница или цифры
				if (rnd == 0) {
					c = String.fromCharCode(this.mtRand(48, 57));
				}
				if (rnd == 1) {
					c = String.fromCharCode(this.mtRand(65, 90));
				}
				if (rnd == 2) {
					c = String.fromCharCode(this.mtRand(97, 122));
				}
				pass += c;
			}
			return pass;
		}
	}
	/* Еще один генератор паролей
	// <input type=text name=first size=46> <input type=button name=generate value="Сгенериравать пароль" onClick="RandomPasw(this.form)">
	<SCRIPT LANGUAGE="JavaScript">
var r
var digit = new Array("0","1","2","3","4","5","6","7","8","9")
var halp = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","Y","Z")
var lalp = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","y","z")
pasw = new String()
function RandomPasw(nameform)
{
   pasw = ""
   
   for (var i= 0; i<8; i++)
   {
      r = Math.random()
      if ( (r - 1.0/3.0) < 0.0)
      {
         r = Math.floor(Math.random() * 9);
         pasw += digit[r]
      }
      else if ( (r - 2.0/3.0) < 0.0)
      {
         r = Math.floor(Math.random() * 24);
         pasw += halp[r]
      }
      else
      {
         r = Math.floor(Math.random() * 24);
         pasw += lalp[r]
      }
   }
   nameform.first.value = pasw
}
// End -->
</script>*/
}


