// Создать элемент
// tag - имя тега
// param - объект с параметрами
// inner_element - Вложеный элемент (может быть массивом или текстом)
function create_element (tag, param, inner_element)
{
	inner_element = inner_element || null;
	
	var elem;
	if(typeof(tag) == "string")
		elem  = document.createElement(tag);
	else
		elem = tag;
			
	if (param) {
		for(var key in param) {
			switch (key) {
				case "inner":
						var html = param[key];
					break;
				case "class":
				case "className":
					if(BrowserDetect.browser=="Explorer") 
						elem.setAttribute("className", param[key]);
					elem.setAttribute("class", param[key]);
					break;
				case "name":
						elem.setAttribute("name", param[key]);
					break;
				case "enctype":
						elem.setAttribute("enctype", param[key]);
						elem.setAttribute("encoding", param[key]);					
					break;
				case "colspan":
					if(BrowserDetect.browser=="Explorer") 
						elem.setAttribute("colSpan", param[key]);
					else
						elem.setAttribute("colspan", param[key]);
					break;
				default:
						elem.setAttribute(key, param[key]);
					break;
			}
		}
	}
	
	if (inner_element) {
		if(typeof(inner_element) == "string")
			elem.appendChild(create_text_element(inner_element));
		else if(is_array(inner_element))
			for(var i=0; i<inner_element.length; i++)
				elem.appendChild(inner_element[i]);
		else
			elem.appendChild(inner_element);
	}
	
	if(html!=undefined) {
		elem.innerHTML = html;
	}
	
	return elem;
}

// Создать текстовый элемент
function create_text_element (text_inner)
{
	var elem;
	elem = document.createTextNode(text_inner);
	return elem;
}


// СИСТЕМНЫЕ

// Выбор объекта
// На входе структура 
//  	form: [form_name, elem_name],
//		id:,
//   	pointer: 
function select_object(uni_id)
{
	var elem;
		
	if(typeof( uni_id ) == 'string') {
		uni_id = {id: uni_id};
	}
		
	if(typeof(uni_id) == "object" && uni_id.nodeType) {
		return uni_id;
	}
	if (uni_id.form){
		if ( is_array(uni_id.form) )
			form_name = uni_id.form[0];
		else
			form_name = uni_id.form;
		
		elem = document.forms[form_name];

		if (is_array(uni_id.form) && uni_id.form[1]) {
			var subelem = uni_id.form[1];
		}
		else if(uni_id.element) 
			var subelem = uni_id.element;
		if(subelem)	
			elem = elem.elements[subelem];
		
		return elem;
	}
	if (uni_id.id) {
		return document.getElementById(uni_id.id);
	}
	if (uni_id.pointer) {
		return uni_id.pointer;
	}
	
	return undefined;
}

function get_attribute (elem, attribute)
{
	var attribute_array = elem.attributes;
	if(!attribute_array || attribute_array.length<1)
		return null;
	
	for (var i=0; attribute_array.length>i; i++) {
		if(attribute_array[i].name==attribute)
			return attribute_array[i].value;
	}
}

function set_attribute (elem, attribute, new_value)
{
	var attribute_array = elem.attributes;
	if(!attribute_array || attribute_array.length<1)
		return null;
	
	for (var i=0; attribute_array.length>i; i++) {
		if(attribute_array[i].name==attribute) {
			attribute_array[i].value = new_value;
			return true;
		}
	}
}

// Получить крозбраузерный target объекта вызвавшего событие
function select_target(evt)
{
	var evt = evt || false;
	
	if(window.event) {
		return window.event.srcElement;
	}
	else if(evt) {
		if(typeof(Event)!="undefined" && evt instanceof Event) {
			return evt.target; 
		}
		else {
			return evt;
		}
	}
	else {
		return false;
	}
		
}


// Получить текст или свойство объекта формы
// elem_pointer - Ссылка на объект
function get_value(elem_pointer) 
{
	if (elem_pointer==undefined)
		return NULL;
		
	var elem_value;
	
	if(elem_pointer.value!=undefined)
		elem_value = elem_pointer.value;
	else if (elem_pointer.text!=undefined)
		elem_value = elem_pointer.text;
	else
		elem_value = elem_pointer.innerHTML;
		
	return elem_value;
}

// Поставить текст или свойство объекта формы
// elem_pointer - Ссылка на объект
function set_value(elem_pointer, elem_value) 
{
	if (elem_pointer==undefined)
		return false;
	
	if(elem_pointer.value!=undefined)
		elem_pointer.value = elem_value;
	else if (elem_pointer.text!=undefined)
		elem_pointer.text = elem_value;
	else
		elem_pointer.innerHTML = elem_value;
		
	return true;
}

// Привязать функцию к событию
// event_name - тип события
// function_pointer - указатель на функцию
// execute - выполнить сразу (для списка - только первому объекту)
function add_event(uid, event_name, function_pointer, execute)
{
	var elem = select_object(uid);
	if(elem) {
		execute = execute || false;
		
		if(!elem.length)
			elem = new Array(elem);
		
		for(var i=0; i< elem.length; i++) {
			if(typeof attachEvent != "undefined") 
				elem[i].attachEvent("on"+event_name, function_pointer );
			else
				elem[i].addEventListener(event_name, function_pointer, false);
			if(execute) { // Выполнить для первого объекта
				function_pointer(elem[i]);
				execute = false;
			}
		}
	}
}

// Привязать функцию к событию
// event_name - тип события
// function_pointer - указатель на функцию
// execute - выполнить сразу (для списка - только первому объекту)
function delete_event(uid, event_name, function_pointer)
{
	var elem = select_object(uid);
	if(elem) {
		
		if(!elem.length)
			elem = new Array(elem);
		
		for(var i=0; i< elem.length; i++) {
			if(typeof detachEvent != "undefined") 
				elem[i].detachEvent("on"+event_name, function_pointer );
			else
				elem[i].removeEventListener(event_name, function_pointer, false);
		}
	}
}


// Системные команды
function is_array( mixed_var ) {   
 
    return ( mixed_var instanceof Array );
}

function array_shift( elem_array ) {    
 
    var tmp_arr = [];
 
    // input sanitation
    if( !elem_array || !elem_array.length ){
        return null;
    }
 	
 	for (var i=1; i<elem_array.length; i++) {
 		tmp_arr[i-1]=elem_array[i];
 	}
 	
    return tmp_arr;
}

// Поставить значение выбрано
function set_select(elem)
{
	if (elem==undefined)
		return false;
		
	if (elem.type=="checkbox" || elem.type=="radio")
		elem.checked=true;
	else
		elem.select=true;
}


// Скопировать из объекта в клипбоард
function copy_clipboard(uid)
{
	var elem = select_object(uid);
	var val = get_value(elem);

	if(val)
		window.clipboardData.setData('Text',val);
}

function set_cookie (name, value, expires, path, domain, secure) {
      document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function get_cookie(name) {
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) {
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	return(setStr);
}



function debug_object(obj, level)
{
	if(typeof(obj)!='object')
		return false;
	container = debug_object_inner(obj);
	document.body.appendChild(container);
}
function debug_object_inner(obj, title_obj, level)
{
	level = level || 0;
	title_obj = title_obj || "";
	var arr = new Array();
	
	if(title_obj)
		arr[arr.length] = create_element("DIV", {style: "font-weight: bold;"}, title_obj+"=>");

	for(var field in obj) {
		if(typeof(obj[field]) == 'object' && level)
			arr[arr.length]= debug_object_inner(obj[field], field, level);
		else 
			arr[arr.length] = create_element("DIV", null, field+": "+obj[field]);
	}	
			
	container = create_element("DIV", {style: "padding-left: 20px;"}, arr);
	return container;
}

function is_ie(version) {
	version = version || 7;
	if(document.all !== undefined && typeof document.body.style.maxHeight == "undefined" && version==6) // Глупый осел
		return true;
	if(document.all !== undefined && version == 7)
		return true;

	return false;
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();
// Получить позицию прокрутки кросбраузерно
function document_scroll()
{
	var yScrolltop;
    var xScrollleft;
    if (self.pageYOffset || self.pageXOffset) {
      yScrolltop = self.pageYOffset;
      xScrollleft = self.pageXOffset;
    } else if(document.documentElement && document.documentElement.scrollTop || document.documentElement.scrollLeft ){   // Explorer 6 Strict
      yScrolltop = document.documentElement.scrollTop;
      xScrollleft = document.documentElement.scrollLeft;
    } else if (document.body) {// all other Explorers
      yScrolltop = document.body.scrollTop;
      xScrollleft = document.body.scrollLeft;
    }
		return new Array(xScrollleft, yScrolltop);
}
// Получить отображаемую высоту документа кросбраузерно
function document_size()
{
	if(window.innerHeight || window.innerWidth) {  
		h = window.innerHeight;
	  	w = window.innerWidth;
	}
	else if (document.documentElement.clientHeight || document.documentElement.clientWidth) {
		h = document.documentElement.clientHeight;
		w = document.documentElement.clientWidth;
	}
					
	return new Array(w, h);
}
// Высота внут реней части окна
function page_size(){
	if (window.innerHeight && window.scrollMaxY) {// Firefox
		yWithScroll = window.innerHeight + window.scrollMaxY;
		xWithScroll = window.innerWidth + window.scrollMaxX;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		yWithScroll = document.body.scrollHeight;
		xWithScroll = document.body.scrollWidth;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		yWithScroll = document.body.offsetHeight;
		xWithScroll = document.body.offsetWidth;
  	}
	arrayPageSizeWithScroll = new Array(xWithScroll,yWithScroll);
	//alert( 'The height is ' + yWithScroll + ' and the width is ' + xWithScroll );
	return arrayPageSizeWithScroll;
}

