<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
 <script type="text/javascript" src="../../popups/popup.js"></script>
 <style type="text/css">
 /*<![CDATA[*/
 html, body {  background-color: ButtonFace;  color: ButtonText; font: 11px Tahoma,Verdana,sans-serif; margin: 0; padding: 0;}
body { padding: 5px; }
 .title { background-color: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; border-bottom: 1px  solid black; letter-spacing: 2px;}
select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
.buttons { width: 70px; text-align: center; }
form { padding: 0px;  margin: 0;}
form .elements{
	padding: 10px; text-align: center;
}
 /*]]>*/
 </style>
<script type="text/javascript" src="../../popups/popup.js"></script>
<script type="text/javascript">
/*<![CDATA[*/
	
    if(window.opener)
        HTMLArea = window.opener.HTMLArea;

	init = function ()
	{
		__dlg_translate('ImageManager');
		
		var param = opener.Dialog._arguments;
		
		if ( param )
		{
		  if ( param.title )
		  {
		    document.title = param.title;
		    document.getElementById("title").innerHTML = param.title;
		  }
		  if ( param.prompt )
		  {
		    document.getElementById("prompt").innerHTML = param.prompt;
		  }
		  if ( param.value )
		  {
		    document.getElementById("f_input").value = param.value;
		  }
		}
		document.getElementById("f_input").focus();
		
		__xinha_dlg_init();
		
	};

	function onCancel()
	{
		__dlg_close(null);
		return false;
	}

	function onOK()
	{
		 // pass data back to the calling window
	  __dlg_close({value:document.getElementById("f_input").value});
	  return false;
	}

	function addEvent(obj, evType, fn)
	{
		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }
		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }
		else {  return false; }
	}

	addEvent(window, 'load', init);
//-->
</script>
</head>
<body >
<div class="title" id="title" style="white-space:nowrap">Please enter value</div>
<form action="">
<div class="elements">
	<label for="f_input" id="prompt"></label>
	<input type="text" id="f_input" style="width:50%"/>
</div>
<div style="text-align: right;">
	  <hr />
	  <button type="button" class="buttons" onclick="return onOK();">OK</button>
	  <button type="button" class="buttons" onclick="return onCancel();">Cancel</button>
</div>
</form>
</body>
</html>