Hi!
I have a problem checking the images when the dcr should be saved. I have written a cgi script to check the image size, resolution and so on and a FormAPI script which is called when the onSave event occures. The problem is, the event occures, the javascript function is called, then this function calls another function which communicates with the cgi. but the first function also does all other commands before the cgi answers. is there a possibility to wait until the cgi has answered??
I am using TS6.1 on Windows 2000.
My FormAPI script:
var itemArray;
var fertig;
var valid;
function init() {
IWEventRegistry.addFormHandler("onSave", save);
}
function containerChoiceChanged() {
alert("containerChoiceChanged");
}
function save() {
IWDatacapture.getItem("/imagecheck").setValue("");
itemArray = new Array();
checkImages();
checkImageArray();
// this line should be called after the cgi has answered!
// but when i say window.setTimeout("return checkItemsValidity()", 4000);
// then the save dialog won't be displayed
return checkItemsValidity()
}
function checkImages() {
var rootItems = IWDatacapture.getRootItems();
for(var i=0; i<rootItems.length; i++) {
recursion(rootItems
);
}
}
function recursion(item) {
var kinder = item.getChildren();
if(kinder != null) {
for(var i=0; i<kinder.length; i++) {
recursion(kinder);
}
} else {
if(item.getType() == "browser") {
if(item.getValue().match(/\.(gif|jpg|jpeg)$/i)) {
itemArray.push(item.getName() + "|" + item.getValue() + "|false");
}
} else if(item.getType() == "text") {
if(item.getValue().match(/\.(gif|jpg|jpeg)$/i)) {
itemArray.push(item.getName() + "|" + item.getValue() + "|true");
}
}
}
}
function checkImageArray() {
var parameters = new Object();
parameters.workarea = getWorkarea();
parameters.cattyp = getCategoryAndType();
parameters.itemArray = getRequestString();
IWDatacapture.callServer("/iw-bin/image_check.ipl",parameters,false);
}
function checkItemsValidity() {
var itemName;
for(var i=0; i<itemArray.length; i++) {
itemName = itemArray;
itemName = itemName.substring(0, itemName.indexOf("|"));
if(!IWDatacapture.getItem(itemName).isValid()) {
alert("valid false");
return false;
}
}
return true;
}
function getRequestString() {
var request = "";
for(var i=0; i<itemArray.length; i++) {
if(i > 0) request += ",";
request += itemArray;
}
return request;
}
function getCategoryAndType() {
return( top.gTDT );
}
function getWorkarea() {
return( top._dcWin.gWorkarea );
}
init();
And my CGI Script:
use strict;
########################################################################
# Required Perl Modules
########################################################################
use CGI;
use hk010::Logger;
use Config::IniFiles;
use Image:
ize;
########################################################################
# Parse CGI Query String
########################################################################
my $query = new CGI;
#foreach my $key ($query->param)
#{
# if ($key !~ /plus/) { $post .= "$key=".$query->param($key)."&"; }
#$l->logLine($key);
#}
########################################################################
# Sets Some Default Script Variables
########################################################################
my $debug = 1;
my $l = new hk010::Logger($debug);
$l->logLine("image_check.ipl entered\n");
my $workarea = $query->param('workarea');
my $cattyp = $query->param('cattyp');
my $item_array = $query->param('itemArray');
#my $zib = $query->param('zib');
#my $element = $query->param('element');
#my $elemvalue = $query->param('elemvalue');
$l->logLine("PARAM: $item_array");
my @items = split(/\,/, $item_array);
my ($element, $elemvalue, $zib, $key, $cfg_path, $size, $resolution, $x, $y);
my $message = "";
my $cfg_file = "WORKAREA/modulbank/config/image.cfg";
my $zib_workarea = "WORKAREA/zib";
my @values;
########################################################################
# SOURCE
########################################################################
print <<"END";
<html>
<head>
<script language="JavaScript">
var api = parent.getScriptFrame();
api.IWDatacapture.setHighlightMode(false);
END
foreach (@items) {
($element, $elemvalue, $zib) = split(/\|/);
$l->logLine("*****************************************");
$l->logLine("WORKAREA: $workarea\nCATTYP: $cattyp\nZIB: $zib\nELEMENT: $element\nELEMVALUE: $elemvalue\n");
$l->logLine("build absolute name of image");
my $image = $workarea . $elemvalue;
if($zib eq "true") {
$image = $workarea;
$image =~ s/(.*\/).*?(_.\/).*/$1zib$2$zib_workarea/;
$image .= $elemvalue;
}
$l->logLine("build key for config file");
$cattyp =~ /(.*)\/(.*)/;
my $section = $1;
$key = $2 . "_";
$element =~ /\/(.*)\//;
$key .= $1;
$key =~ s/\//_/g;
$key =~ s/\[.+\]/X/g;
$l->logLine("KEY: $key");
$l->logLine("build path of config file");
$cfg_path = $workarea;
$cfg_path =~ s/(.*\/).*?(_.\/).*/$1vorlagen$2$cfg_file/;
$l->logLine("CFG_PATH: $cfg_path");
$l->logLine("read config file");
my $cfg = new Config::IniFiles( -file => $cfg_path );
$l->logLine("read value of the key");
@values = split(/-/,$cfg->val( $section, $key ));
$l->logLine("VALUE: " . @values);
if(@values < 7) {
$l->logLine("Could not read value of key $key");
} else {
$l->logLine("get width, height, size of image");
($x, $y) = imgsize($image);
$l->logLine("X: $x\nY: $y");
$size = (-s $image);
$l->logLine("SIZE: $size");
$l->logLine("get resolution of image");
my $cmd = "C:\\Programme\\ImageMagick\\identify -format \"%x\" y:\\default\\main\\hk010\\internet_d\\volksbank_at\\WORKAREA\\modulbank\\images\\logo.gif";
$resolution = `$cmd 2>&1`;
$resolution =~ s/\n//g;
$l->logLine("RESOLUTION: $resolution");
$l->logLine("start comparing values of image with values from config file");
#size
if($size > ($values[0] * 1024)) {
$message .= "- Es darf die Größe von $values[0] KB nicht überschreiten (dzt. " . $size / 1000 . " KB) !\\n";
}
# width
if($x < $values[1] || $x > $values[2]) {
$message .= "- Es muss zwischen $values[1] und $values[2] Pixel breit sein (dzt. $x Pixel) !\\n";
}
# height
if($y < $values[3] || $y > $values[4]) {
$message .= "- Es muss zwischen $values[3] und $values[4] Pixel hoch sein (dzt. $y Pixel)!\\n";
}
# resolution
if ($resolution !~ /^\d+$/) {
$l->logLine("error while checking resolution: $resolution");
} else {
if($resolution < $values[5] || $resolution > $values[6]) {
$message .= "- Es muss eine Auflösung zwischen $values[5] und $values[6] dpi haben (dzt. $resolution dpi)!\\n";
}
}
}
if($debug > 1) {
print <<" END";
alert("WORKAREA: $workarea\\nCATTYP: $cattyp\\nZIB: $zib\\nELEMENT: $element\\nELEMVALUE: $elemvalue\\nKEY: $key\\nCFG_PATH: $cfg_path\\nX: $x\\nY: $y\\nSIZE: $size\\nRESOLUTION: $resolution\\nPARAM: $item_array");
END
}
if(@values < 7) { # if no entry in config file for this key
$l->logLine("image $elemvalue could not be checked because key-entry $key is not available in config file");
if($debug > 1) {
print <<" END";
alert("Das Bild $elemvalue konnte nicht überprüft werden, da das Feld \'$key\'\\nnicht in der Konfigurationsdatei eingetragen ist!");
END
}
} elsif($message ne "") { # if image does not match the values from config file
$l->logLine("image check failed:\n$message");
print <<" END";
alert("Das Bild $elemvalue darf hier nicht verwendet werden:\\n\\n$message");
api.IWDatacapture.getItem("$element").setValid(false);
api.IWDatacapture.setHighlightMode(true);
//api.IWDatacapture.redrawLabels();
END
$message = "";
} else { # image matches the values from config file
$l->logLine("image check successful");
if($debug > 1) {
print <<" END";
alert("Format von Bild $elemvalue paßt");
END
}
print <<" END";
api.IWDatacapture.getItem("$element").setValid(true);
//api.IWDatacapture.setHighlightMode(false);
//api.IWDatacapture.redrawLabels();
//api.IWDatacapture.redraw();
//api.IWDatacapture.save();
//api.IWDatacapture.displayMessage("");
END
}
}
print <<"END";
api.IWDatacapture.redrawLabels();
api.IWDatacapture.getItem("/imagecheck").setValue("fertig");
</script>
</head>
<body>
</body>
</html>
END
$l->logLine("\nimage_check.ipl done");
$l->flushToFile();