var Page = new Object();
var uniform;

Page.Request = null;

window.onload = Init;

var isIE  = ( ( navigator.userAgent.indexOf( "MSIE" ) != -1 ) ? 1 : 0 );
var isFF  = ( ( navigator.userAgent.indexOf( "Firefox" ) != -1 ) ? 1 : 0 );
var isOpera  = ( ( navigator.userAgent.indexOf( "Opera" ) != -1 ) ? 1 : 0 );

initObj = new Array();

function Init()
{
    Page = { Message: $('MessageHolder') };
    Page.Message.Bg = $('MessageBg');
    uniform = $('uniform');
    
    try{ BeforeInit(); } catch(e){}
    
    Event.observe( Page.Message, 'mousedown', function(e){ e.cancelBubble = true; } );
    Event.observe( 'Body', 'mousedown', function(e){ HideMessage(); } );

	for(c = 0; c < initObj.length; c ++)
		initObj[c]();
    try{ AfterInit(); } catch(e){}
}

function onResize(){}
function onContextMenu(){return false;}


initObj[initObj.length] = function(){};

function createObj(tag, id, className, display, src)
{
	var cObj = document.createElement(tag);

	if(id)
		cObj.id = id;

	if(className)
		cObj.className = className;

	if(display)
		cObj.style.display = display;
		
	if(src)
		cObj.src = src;

	return cObj;
}

function addEvt(el, evname, func) {
	if (el.attachEvent) 
	{
		el.attachEvent("on" + evname, func);
	}
	else if (el.addEventListener) 
	{ 
		el.addEventListener(evname, func, true);
	}
	else 
	{
		el["on" + evname] = func;
	}
}

function remEvt(el, evname, func) {
	if (el.detachEvent) 
	{
		el.detachEvent("on" + evname, func);
	}
	else if (el.removeEventListener)
	{
		el.removeEventListener(evname, func, true);
	}
	else
	{
		el["on" + evname] = null;
	}
}

function getElement(ev)
{
	var evtEl = ev.target ? ev.target : ev.srcElement;
	
	return evtEl;
}

//Удалить пробелы из начала и с конца строки
function Trim(str,chr)
{
    if( !chr ) chr = ' ';
    if(!str || str.length == 0) return '';
    str = str + '';
    while( str.indexOf(chr) == 0 ) str = str.substr( 1 );
    while( str.lastIndexOf(chr) == str.length - 1 ) str = str.substr(0,str.length-1);
    return str;
}

//Показать окошко диалога с сообщением или формой
function ShowMessage( text, options )
{
	if( !Page.Message )
    {
        alert( text );
        return;
    }
	
    var html = '';
    if( !options ) options = new Object();
    
    if( options.Title ) html += '<div class="MessageTitle">'+ options.Title + '</div>';
    if( options.Class ) Page.Message.className = options.Class; else Page.Message.className = 'NormalMessage';
    if( text ) html += text;   

    Element.hide( Page.Message.Bg );
    Element.hide( Page.Message );

	$('Message').innerHTML = html;
    
    //Display устанавливаем в block чтобы сообщение имело отличные от нуля размеры, иначе мы не сможем его спозиционировать.
	Page.Message.style.visibility = 'hidden';
	Page.Message.style.display = 'block';

	//Положение окна на экране
	Page.Message.style.top = ( options.Top ) ? options.Top : document.body.scrollTop + document.body.clientHeight / 2 - 50;
	Page.Message.style.left = ( options.Left ) ? options.Left : document.body.clientWidth / 2 - Page.Message.offsetWidth / 2;

    AlignBgIframe( Page.Message.Bg, Page.Message );
    
    //Ставим display = none чтобы показать сообщение с помощью Effect.Appear
	Page.Message.style.display = 'none';
	Page.Message.style.visibility = 'visible';

	if( !options.Quick )
	{
		new Effect.Appear( Page.Message.Bg, {from: 0.0, to:0.75, duration:0.2 } );
		new Effect.Appear( Page.Message, {from: 0.0, to:0.75, duration:0.2 } );
	}
	else
	{
		new Effect.Appear( Page.Message.Bg, {from: 0.0, to:0.85, duration: 0.0 } );
		new Effect.Appear( Page.Message, {from: 0.0, to:0.85, duration: 0.0 } );
	}
}

function ShowError( text, options )
{
    if( !options ) options = new Object();
    options.Class = 'ErrorMessage';
    ShowMessage( text, options );
}

function ShowSuccess( text, options )
{
    if( !options ) options = new Object();
    options.Class = 'SuccessMessage';
    ShowMessage( text, options );
}

//Скрыть сообщение
function HideMessage()
{
	if( Page.Message )
	{
    	if( Page.Message.Bg.style.display != 'none' )
    	{
    	    new Effect.Fade( Page.Message.Bg, {from: 0.45, to:0.0, duration:0.2 } );
    		new Effect.Fade( Page.Message, {from: 0.45, to:0.0, duration:0.2 } );
    	}
    }
}

//Расположить iframe под элементом element, чтобы сквозь элемент не просвечивали выпадающие списки (глюк браузера)
function AlignBgIframe( iframe, element )
{
	iframe.style.top = element.style.top;
	iframe.style.left = element.style.left;
	iframe.style.width = element.offsetWidth;
	iframe.style.height = element.offsetHeight;
}

//Открыть синхронный request
function OpenRequest( url, par, delegate )
{
    if( window.ActiveXObject )
	    Page.Request = new ActiveXObject("Microsoft.XMLHTTP");
    else
	    Page.Request = new XMLHttpRequest();

	if( delegate ) Page.Request.onreadystatechange = delegate;
	Page.Request.open("POST", url, false);
	Page.Request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" );
	Page.Request.send( par );
}

function	ExecuteQuery( page, queryId, pars, noreload )
{
	var url = '/gs/sqlexecutor.wide';
	var par = 'debug=1&page=' + page + '&query-id=' + queryId + (( pars ) ? '&params=' + pars : '');

	OpenRequest( url, par, null );
    if( Page.Request.responseXML )
    {
	    var doc	= Page.Request.responseXML.documentElement;	
	    if( !doc ) return;
		if( doc.getElementsByTagName( "exceptions" )[0] == null || doc.getElementsByTagName( "exceptions" )[0].childNodes.length == 0 )
			return doc.getElementsByTagName( 'return-value' )[0].firstChild.data;
	}
	else alert('Получен невалидный XML при попытке выполнить запрос. Обратитесь к администратору сайта.');
}

function HasExceptions()
{
    return ( Page.Request.responseText.indexOf('result code="0"') < 0 );
}

//Динамическая загрузка списка
function DynamicLoad ( select, url, displaymember, valuemember )
{
	var pars = ( url.indexOf( '?' ) > 0 ) ? url.substring( url.indexOf( '?' ) + 1, url.length ) : '';
	url = ( url.indexOf( '?' ) > 0 ) ? url.substring( 0, url.indexOf( '?' ) ) : url;

	if( pars.indexOf( 'debug' ) < 0 )
		pars = pars + '&debug=1';
	if( pars.indexOf( 'page-capacity' ) < 0 )
		pars = pars + '&page-capacity=0';
	OpenRequest( url, pars, null );
	if( Page.Request.responseXML )
	{
		var doc	= Page.Request.responseXML.documentElement;
		var trNodes = doc.getElementsByTagName( "tr" );

		var restore = false;
		var oldvalues = new Array();
		for( var i=0;i<select.options.length;i++ )
		{
			if( select.options[i].selected ) oldvalues[oldvalues.length] = select.options[i].value;
		}
		select.options.length = 0;

		if( !displaymember ) displaymember = 'name';
		if( !valuemember ) valuemember = 'unirowid';

		displaymember = displaymember.toLowerCase();		
		valuemember = valuemember.toLowerCase();

		var option = new Option ( "", "", false, false );
		select.options[0] = option;

		for (var i=0; i<trNodes.length; ++i) //"tr"
		{
			var id, text;
			var childs = trNodes[i].childNodes; // "td" 
			for (var j=0; j<childs.length; ++j)
			{
				var node = childs.item(j);

				if( node.getAttribute( "field" ).toLowerCase() == displaymember )
					text = node.getAttribute( "actual-value" );
				if( node.getAttribute( "field" ).toLowerCase() == valuemember )
					id = node.getAttribute( "actual-value" );
			}
			var option = new Option ( text, id, false, false );
			select.options[select.length]=option;
			for( var j=0;j<oldvalues.length;j++ ) if( oldvalues[j] == id ) option.selected = true;	
		}
	}
	else
		ShowMessage( 'Получен неправильный XML! Обратитесь к разработчику!' );
}

function AddToCart(jewelid, amount)
{
    var mmcform = document.forms['markingcolors'];
    var colorid = 0;
    if( mmcform )
    {
        for( var i=0;i<mmcform.elements.length;i++ )
            if( mmcform.elements[i].checked ) { colorid = mmcform.elements[i].value; break; }
        if( colorid == 0 ) { ShowError('Выберите цвет вставки!'); return; }
    }
    OpenRequest('func/addtocart.ivp','debug=1&jewelid=' + jewelid + '&amount=' + amount + '&colorid=' + colorid, null);
    if( HasExceptions() ) ShowMessage( 'Ошибка! Товар не может быть добавлен, скорее всего, вы не авторизованы.' );
	else ShowMessage(amount ? 'Товар добавлен в корзину.' : 'Товар удален из корзины.');
}

function CommitOrder(request)
{
    request = 'debug=1' + request;    
    OpenRequest('func/commitorder.ivp',request, null);
    if( HasExceptions() )
    { 
        ShowMessage('Возникли ошибки при подтверждении заказа.');
        return false; //Невозможно подтвердить заказ.
    }
    return true;
}

function AddToRequestIfNotNull(string, urlname)
{
    if(string != null)
        return '&' + urlname + '=' + string;
    else 
        return '';
}

function RecalculateOrder(orderid, priceid)
{
    OpenRequest('func/recalculateorder.ivp','debug=1&orderid=' + orderid + '&priceid=' + priceid, null);
    if( HasExceptions() ) ShowMessage( 'Невозможно пересчитать заказ, скорее всего, вы не авторизованы. ' );
}

function DeleteOrder(orderid)
{
    if( !confirm('Вы уверены, что хотите удалить заказ №' + orderid + '?') ) return;
    OpenRequest('func/deleteorder.ivp','debug=1&orderid=' + orderid , null);
    if( HasExceptions() ) ShowMessage( 'Невозможно удалить заказ, скорее всего, вы не авторизованы, или заказ находится в статусе, отличном от "Новый заказ". ' );
    else document.location.reload();
}

function EditDetails()
{
    $('editdetails').submit();
}

function ForgotPassword(email)
{
    if( !email || email == 'E-mail' ) { ShowMessage('Введите email!'); return; }
    OpenRequest('func/resetpassword.ivp','debug=1&optype=getresetpasswordlink&email=' + email );
    var doc;
    if( window.ActiveXObject )
    {
        doc = new ActiveXObject('Microsoft.XMLDOM');
        doc.loadXML(Page.Request.responseText);
    }
    else
    {
        var parser = new DOMParser();
        doc = parser.parseFromString(Page.Request.responseText,'text/xml');
    }
    if( !doc ) { ShowMessage('Сервис временно недоступен'); return; }
    else
    {
        if( doc.getElementsByTagName('element')[0].getElementsByTagName('message').length > 0 )
            ShowMessage('Ссылка для изменения пароля отправлена вам на email.');
        else
            ShowMessage("Пользователь с указанным вами email'ом не существует.");
    }
}

function setValue(id, val)
{
	document.getElementById(id).value = val;
}

function showLargeImage(ImageId, ImageTitle)
{
	var width = 200;
	var height = 200;
	
	var left = parseInt((screen.availWidth / 2) - (width / 2));
	var top = parseInt((screen.availHeight / 2) - (height / 2));
	
	var subwin = window.open('','subwindow','resizable=0, scrollbars=0, width=' + width + ', height=' + height + ', left=' + left + ', top=' + top);	
	
	var baseURL = document.getElementsByTagName("base")[0].href;
	
	subwin.document.title = ImageTitle ? ImageTitle : "Фото";
	
	subwin.document.body.innerHTML = "<img height='200' width='200' style='position: absolute; top: 0; left: 0' src='" + baseURL + "openfile.wide?fileid=" + ImageId + "' />";
	
	subwin.focus();
}

function OpenFeedback(themeid, url)
{
    var baseURL = document.getElementsByTagName("base")[0].href;
    window.open(baseURL+'/contacts/feedback.ivp?themeid='+themeid+'&fldurl='+encodeURIComponent(url), 'ask', 'resizable=1,scrollbars=1,width=700,height=650,left=' + (screen.width-700)/2 + ',top=' + (screen.height-550)/2);
}

function OpenFoto( id, w, h )
{
    var newWindow;
    var baseURL = document.getElementsByTagName("base")[0].href;
    newWindow=window.open('','','toolbar=no,scrollbars=no,left=10,top=10,width=' + w +',height=' + (h + 23))
    newWindow.document.open("text/html","replace");
    newWindow.document.write('<html><body style="margin:0px">');
    newWindow.document.write('<center><img src="'+baseURL+'/openfile.wide?fileid=' + id + '" alt=""></center>');
    newWindow.document.write('<center><a href=# onClick="javacript: window.close();" style="color: Black;font-family: Verdana;font-size: 10pt;">Закрыть</a></center>');
    newWindow.document.write('</body></html>');
    newWindow.document.close();
}
function OpenFotoWs( id, w, h )
{
    var newWindow;
    var baseURL = document.getElementsByTagName("base")[0].href;
    newWindow=window.open('','','toolbar=no,scrollbars=no,left=10,top=10,width=' + w +',height=' + (h + 23))
    newWindow.document.open("text/html","replace");
    newWindow.document.write('<html><body style="margin:0px">');
    newWindow.document.write('<center><img src="'+baseURL+'/openfile.wide?fileid=' + id + '" alt=""></center>');
    newWindow.document.write('<center><a href=# onClick="javacript: window.close();" style="color: Black;font-family: Verdana;font-size: 10pt;">Закрыть</a></center>');
    newWindow.document.write('</body></html>');
    newWindow.document.close();
}
function RedirectTo( url )
{
    document.location.href = url;
}
function regionidchanged(value)
{
	DynamicLoadWithoutFirstNullOption ( $('city'), 'city_list.wide?pg_where=RegionId=' + value, null, null );
	DynamicLoadWithoutFirstNullOption ( $('deliverycost'), 'city_list.wide?pg_where=RegionId=' + value, 'deliverycost', null );
}

function DynamicLoadWithoutFirstNullOption ( select, url, displaymember, valuemember )
{
	var pars = ( url.indexOf( '?' ) > 0 ) ? url.substring( url.indexOf( '?' ) + 1, url.length ) : '';
	url = ( url.indexOf( '?' ) > 0 ) ? url.substring( 0, url.indexOf( '?' ) ) : url;

	if( pars.indexOf( 'debug' ) < 0 )
		pars = pars + '&debug=1';
	if( pars.indexOf( 'page-capacity' ) < 0 )
		pars = pars + '&page-capacity=0';
	OpenRequest( url, pars, null );
	if( Page.Request.responseXML )
	{
		var doc	= Page.Request.responseXML.documentElement;
		var trNodes = doc.getElementsByTagName( "tr" );

		var restore = false;
		var oldvalues = new Array();
		for( var i=0;i<select.options.length;i++ )
		{
			if( select.options[i].selected ) oldvalues[oldvalues.length] = select.options[i].value;
		}
		select.options.length = 0;

		if( !displaymember ) displaymember = 'name';
		if( !valuemember ) valuemember = 'unirowid';

		displaymember = displaymember.toLowerCase();		
		valuemember = valuemember.toLowerCase();

		for (var i=0; i<trNodes.length; ++i) //"tr"
		{
			var id, text;
			var childs = trNodes[i].childNodes; // "td" 
			for (var j=0; j<childs.length; ++j)
			{
				var node = childs.item(j);

				if( node.getAttribute( "field" ).toLowerCase() == displaymember )
					text = node.getAttribute( "actual-value" );
				if( node.getAttribute( "field" ).toLowerCase() == valuemember )
					id = node.getAttribute( "actual-value" );
			}
			var option = new Option ( text, id, false, false );
			select.options[select.length]=option;
			for( var j=0;j<oldvalues.length;j++ ) if( oldvalues[j] == id ) option.selected = true;	
		}
	}
	else
		ShowMessage( 'Получен неправильный XML! Обратитесь к разработчику!' );
}

function RadioChecked(radiobuttons)
{
	for(var i = 0; i < radiobuttons.length; i++)
	{
		if(!radiobuttons[i].checked)
	    	radiobuttons[i].className = 'noborder';
	    else
	        radiobuttons[i].className = 'noborder checked';
	}
}

function SelectDefaultRadioButton(radiobuttons)
{
	for(var i = 0; i < radiobuttons.length; i++)
	{
		if(radiobuttons[i].className.indexOf('checked') != -1)
	    	radiobuttons[i].checked = 'true';
	}
}