a:9:{s:4:"name";s:16:"rss_admin_resize";s:7:"version";s:3:"0.1";s:6:"author";s:9:"Rob Sable";s:10:"author_uri";s:27:"http://www.wilshireone.com/";s:11:"description";s:71:"Resizing for textareas while editing forms, pages, styles and articles.";s:4:"type";i:1;s:4:"help";s:125:"
	<h1>Resize Textareas</h1>

	<p>This plugin will automatically resize textareas for forms, pages, css and articles.</p>



 ";s:4:"code";s:6707:"
if (@txpinterface == 'admin') {

  $expire = time()+60*60*24*30*12*5;
  if (!isset($_COOKIE["rFormCols"])) setcookie("rFormCols", 60, $expire);
  if (!isset($_COOKIE["rFormRows"])) setcookie("rFormRows", 20, $expire);
  if (!isset($_COOKIE["rPageCols"])) setcookie("rPageCols", 60, $expire);
  if (!isset($_COOKIE["rPageRows"])) setcookie("rPageRows", 20, $expire);
  if (!isset($_COOKIE["rStyleCols"])) setcookie("rStyleCols", 60, $expire);
  if (!isset($_COOKIE["rStyleRows"])) setcookie("rStyleRows", 20, $expire);
  if (!isset($_COOKIE["rArticleCols"])) setcookie("rArticleCols", 50, $expire);
  if (!isset($_COOKIE["rArticleRows"])) setcookie("rArticleRows", 15, $expire);
  if (!isset($_COOKIE["rExcerptRows"])) setcookie("rExcerptRows", 5, $expire);
  if (!isset($_COOKIE["rTitleSize"])) { setcookie("rTitleSize", 40, $expire); header("Location: index.php?event=resize");  }

  // Add a new tab under 'admin' called 'input resize', for the 'resize' event
  register_tab("admin", "resize", "resize");

  // 'rss_admin_resizer' will be called to handle the 'resize' event
  register_callback("rss_admin_resizer", "resize");

  register_callback("rss_admin_resize_form", "form");
  register_callback("rss_admin_resize_page", "page");
  register_callback("rss_admin_resize_css", "css");
  register_callback("rss_admin_resize_article", "article");
}

function rss_admin_resizer($event, $step) {

  if (ps("save")) {
    $expire = time()+60*60*24*30*12*5;
    setcookie("rFormCols", ps("rFormCols"), $expire);
    setcookie("rFormRows", ps("rFormRows"), $expire);
    setcookie("rPageCols", ps("rPageCols"), $expire);
    setcookie("rPageRows", ps("rPageRows"), $expire);
    setcookie("rStyleCols", ps("rStyleCols"), $expire);
    setcookie("rStyleRows", ps("rStyleRows"), $expire);
    setcookie("rArticleCols", ps("rArticleCols"), $expire);
    setcookie("rArticleRows", ps("rArticleRows"), $expire);
    setcookie("rExcerptRows", ps("rExcerptRows"), $expire);
    setcookie("rTitleSize", ps("rTitleSize"), $expire);
    header("Location: index.php?event=resize");
    exit;
  }

  pagetop("Pluginstaller");

  $tdaStyle = ' style="text-align:right;vertical-align:middle"';
  // The eInput/sInput part of the form is important, setting the event and step respectively
  echo form(startTable("list").
  tr(tdcs(hed("Textarea/Input Field Sizing",1),2)).
  tr(tda(gTxt('Form Textarea Cols'), $tdaStyle).td(fInput('text','rFormCols',$_COOKIE["rFormCols"],'edit','','',5))).
  tr(tda(gTxt('Form Textarea Rows'), $tdaStyle).td(fInput('text','rFormRows',$_COOKIE["rFormRows"],'edit','','',5))).
  tr(tda(gTxt('Page Textarea Cols'), $tdaStyle).td(fInput('text','rPageCols',$_COOKIE["rPageCols"],'edit','','',5))).
  tr(tda(gTxt('Page Textarea Rows'), $tdaStyle).td(fInput('text','rPageRows',$_COOKIE["rPageRows"],'edit','','',5))).
  tr(tda(gTxt('Style Textarea Cols'), $tdaStyle).td(fInput('text','rStyleCols',$_COOKIE["rStyleCols"],'edit','','',5))).
  tr(tda(gTxt('Style Textarea Rows'), $tdaStyle).td(fInput('text','rStyleRows',$_COOKIE["rStyleRows"],'edit','','',5))).
  tr(tda(gTxt('Article Textarea Cols'), $tdaStyle).td(fInput('text','rArticleCols',$_COOKIE["rArticleCols"],'edit','','',5))).
  tr(tda(gTxt('Article Textarea Rows'), $tdaStyle).td(fInput('text','rArticleRows',$_COOKIE["rArticleRows"],'edit','','',5))).
  tr(tda(gTxt('Excerpt Textarea Rows'), $tdaStyle).td(fInput('text','rExcerptRows',$_COOKIE["rExcerptRows"],'edit','','',5))).
  tr(tda(gTxt('Title Input Size'), $tdaStyle).td(fInput('text','rTitleSize',$_COOKIE["rTitleSize"],'edit','','',5))).
  tr(tda(fInput("submit","save",gTxt("save_button"),"publish").eInput("resize").sInput("step_a"), " colspan=\"2\" class=\"noline\"")).
  endTable());

}

function rss_admin_resize_form($event, $step) {
$formcols = $_COOKIE["rFormCols"];
$formrows = $_COOKIE["rFormRows"];
$frmNum = ($_COOKIE['qpSelectOnly']) ? "1" : "0";
echo <<< EOF
<script language="JavaScript" type="text/javascript">
<!--
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(function() {
  ta = document.forms[$frmNum].Form;
  ta.setAttribute('style','');
  ta.setAttribute('cols','$formcols');
  ta.setAttribute('rows','$formrows');

});
-->
</script>
EOF;
}

function rss_admin_resize_page($event, $step) {
$pageCols = $_COOKIE["rPageCols"];
$pageRows = $_COOKIE["rPageRows"];
$frmNum = ($_COOKIE['qpSelectOnly']) ? "1" : "0";
echo <<< EOF
<script language="JavaScript" type="text/javascript">
<!--
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(function() {
  ta = document.forms[$frmNum].html;
  ta.setAttribute('style','');
  ta.setAttribute('cols','$pageCols');
  ta.setAttribute('rows','$pageRows');
});
-->
</script>
EOF;
}

function rss_admin_resize_css($event, $step) {
$styleCols = $_COOKIE["rStyleCols"];
$styleRows = $_COOKIE["rStyleRows"];
$frmNum = ($_COOKIE['qpSelectOnly']) ? "1" : "0";
echo <<< EOF
<script language="JavaScript" type="text/javascript">
<!--
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(function() {
  ta = document.forms[$frmNum].css;
  ta.setAttribute('style','');
  ta.setAttribute('cols','$styleCols');
  ta.setAttribute('rows','$styleRows');
});
-->
</script>
EOF;
}

function rss_admin_resize_article($event, $step) {
$articleCols = $_COOKIE["rArticleCols"];
$articleRows = $_COOKIE["rArticleRows"];
$excerptRows = $_COOKIE["rExcerptRows"];
$titleSize = $_COOKIE["rTitleSize"];
$frmNum = ($_COOKIE['qpSelectOnly']) ? "1" : "0";
echo <<< EOF
<script language="JavaScript" type="text/javascript">
<!--
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

addLoadEvent(function() {
  ta = document.forms[$frmNum].Body;
  ta.setAttribute('style','');
  ta.setAttribute('cols','$articleCols');
  ta.setAttribute('rows','$articleRows');

  ta = document.forms[$frmNum].Excerpt;
  ta.setAttribute('style','');
  ta.setAttribute('cols','$articleCols');
  ta.setAttribute('rows','$excerptRows');

  ta = document.forms[$frmNum].Title;
  ta.setAttribute('size','$titleSize');

});
-->
</script>
EOF;
}
";s:3:"md5";s:32:"cc8f429bad5251e68a08a5a8368d1858";}