﻿/*
Saul Blumenthal Studios
jSiniTwo
Version 1.0.0 -- 4/20/2010
*/

var nullString = "***NULL***"; // to represent as strings any null values returned from the server

// execute upon page load
$j(document).ready(function ()
{
	// load json.js for IE to add support for JSON object
	$j.ajax({
		url: 'json2.js',
		dataType: 'script',
		async: false,
		success: function() {
		}
	});
	
	// the below variables are commonly accessed properties
	userId = SiniGetValue("SystemProperty", "LoggedOnUserID", null); // logged-in user
	adminId = SiniGetValue("SystemProperty", "AdminLoggedOnUserID", null); // logged-in admin for admin site inserts
	docId = SiniGetValue("SystemProperty", "CurrentUserDocument", null); // current user document
});

var userId;
var adminId;
var docId;

// SINI return values
var eSuccess = 0; // successful call
var eBadValueType = 1; // the fieldType argument was not a supported name (maybe misspelled)
var eBadFieldName = 2; // the fieldName argument was not supported for the given fieldType
var eBadObjectID = 3; // the object ID is not valid for the given fieldType
var eInvalidValue = 4; // the value is not a valid choice for the given fieldName
var eDuplicateValue = 5; // duplicate values are forbidden for the given fieldName
var eReadOnlyField = 6; // the given fieldName is a read-only field
var eCannotSetToNull = 7; // null values are forbidden for the given fieldName
var eSecurityViolation = 8; // the security token is invalid
var eUnknownError = 9; // some other exception occurred while processing the call
var eNoUserSession = 10; 	// a call was made which requires a logged-on user, but there is none (e.g.
							//DisplayMessage from a pure SINI module).

function SiniGetValue(fieldType, fieldName, objectId)
{
	// make a new FieldValue object and convert it to JSON and send it to the server
	var fv = new FieldValue(fieldType, fieldName, objectId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("GetValue", j);
	// extract the value from the response object
	return retJson.fieldValue;
}

function SiniSetValue(fieldType, fieldName, objectId, fieldValue)
{
	var fv = new FieldValue(fieldType, fieldName, objectId, fieldValue);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("SetValue", j);
	return retJson.fieldValue;
}

function SiniGetListValue(fieldType, fieldName, objectId)
{
	var fv = new FieldValue(fieldType, fieldName, objectId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("GetListValue", j);
	// the return JSON represents an array of FieldValue objects
	// loop through the array and get each value
	var retArray = new Array();
	$j.each(retJson, function(i,fv){
		retArray[i] = fv.fieldValue;
	});
	return retArray;
}

function SiniGetValues(fvs)
{
	var j = JSON.stringify(fvs);
	var retJson = jSiniTwoPost("GetValues", j);
	var retArray = new Array();
	$j.each(retJson, function(i,fv){
		retArray[i] = new FieldValue(fv.fieldType, fv.fieldName, fv.objectId, fv.fieldValue);
	});
	return retArray;
}

function SiniSetValues(fvs)
{
	var j = JSON.stringify(fvs);
	var retJson = jSiniTwoPost("SetValues", j);
	return retJson.fieldValue;
}

function SiniGetAllValues(fieldType, objectId)
{
	var fv = new FieldValue(fieldType, null, objectId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("GetAllValues", j);
	var retArray = new Array();
	$j.each(retJson, function(i,fv){
		retArray[i] = new FieldValue(fv.fieldType, fv.fieldName, fv.objectId, fv.fieldValue);
	});
	return retArray;
}

function SiniAddBaseNameToStringPath(stringPrefix)
{
	var fv = new FieldValue(null, null, null, stringPrefix);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("AddBaseNameToStringPath", j);
	return retJson.fieldValue;
}

function SiniAddUserToGroup(userID, groupName)
{
	var fv = new FieldValue(null, userID, null, groupName);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("AddUserToGroup", j);
	return retJson.fieldValue;
}

function SiniCollectPayment(orderId)
{
	var fv = new FieldValue(null, null, orderId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("CollectPayment", j);
	return retJson.fieldValue;
}

function SiniCreateDocument(productId)
{
	var fv = new FieldValue(null, null, productId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("CreateDocument", j);
	return retJson.fieldValue;
}

function SiniCreatePdfProofForDocument(docId, location)
{
	var fv = new FieldValue(null, null, docId, location);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("CreatePdfProofForDocument", j);
	return retJson.fieldValue;
}

function SiniCreatePendingOrder()
{
	var retJson = jSiniTwoPost("CreatePendingOrder", null);
	return retJson.fieldValue;	
}

function SiniCreateUser(loginName)
{
	var fv = new FieldValue(null, null, null, loginName);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("CreateUser", j);
	return retJson.fieldValue;
}

function SiniDeleteAsset(assetId)
{
	var fv = new FieldValue(null, null, assetId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("DeleteAsset", j);
	return retJson.fieldValue;
}

function SiniDeleteDocument(docId)
{
	var fv = new FieldValue(null, null, docId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("DeleteDocument", j);
	return retJson.fieldValue;
}

function SiniFindDocumentID(externalDocumentId)
{
	var fv = new FieldValue(null, null, externalDocumentId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("FindDocumentID", j);
	return retJson.fieldValue;
}

function SiniFindOrderID(externalOrderId)
{
	var fv = new FieldValue(null, null, externalOrderId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("FindOrderID", j);
	return retJson.fieldValue;
}

function SiniFindUserID(userLogon)
{
	var fv = new FieldValue(null, null, userLogon, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("FindUserID", j);
	return retJson.fieldValue;
}

function SiniFindMatchingObjects(fieldType, matchValues)
{
	var fv = new FieldValue(fieldType, null, null, null);
	var j = JSON.stringify([fv, matchValues]);
	var retJson = jSiniTwoPost("FindMatchingObjects", j);
	// the return JSON represents an array of FieldValue objects
	// loop through the array and get each value
	var retArray = new Array();
	$j.each(retJson, function(i,fv){
		retArray[i] = fv.fieldValue;
	});
	return retArray;
}

function SiniFinishEditingSession(saveDocument)
{
	var fv = new FieldValue(null, saveDocument, null, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("FinishEditingSession", j);
	return retJson.fieldValue;
}

function SiniGetLocalizedString(key, locale)
{
	var fv = new FieldValue(null, key, null, locale);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("GetLocalizedString", j);
	return retJson.fieldValue;
}

function SiniIsListGroup(groupName)
{
	var fv = new FieldValue(null, null, null, groupName);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("IsListGroup", j);
	return retJson.fieldValue;
}

function SiniLogMessage(message, orderID, documentID, importance, isError)
{
	var fv1 = new FieldValue(message, orderID, documentID, importance);
	var fv2 = new FieldValue(null, null, null, isError);
	var j = JSON.stringify([fv1, fv2]);
	var retJson = jSiniTwoPost("LogMessage", j);
	return retJson.fieldValue;
}

function SiniPlaceOrder()
{
	var j = JSON.stringify(null);
	var retJson = jSiniTwoPost("PlaceOrder", j);
	return retJson.fieldValue;
}

function SiniRemoveBaseNameFromStringPath(stringPrefix)
{
	var fv = new FieldValue(null, null, null, stringPrefix);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("RemoveBaseNameFromStringPath", j);
	return retJson.fieldValue;
}

function SiniRemoveUserFromGroup(userID, groupName)
{
	var fv = new FieldValue(null, userID, null, groupName);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("RemoveUserFromGroup", j);
	return retJson.fieldValue;
}

function SiniRevalidateDocument(documentId)
{
	var fv = new FieldValue(null, null, documentId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("RevalidateDocument", j);
	return retJson.fieldValue;
}

function SiniSearchProducts(searchTokens, userId, bIncludeArchived, bReleasedOnly, bStagedOnly)
{
	// create an array of FieldValue objects where just the fieldValue is filled out, holding the search strings
	var searchTokensArray = new Array();
	for (var token in searchTokens)
	{
		searchTokensArray[token] = new FieldValue(null, null, null, searchTokens[token]);
	}
	// create a FieldValue object to hold the remaining parameters
	var fv = new FieldValue(bIncludeArchived, bReleasedOnly, userId, bStagedOnly);
	var j = JSON.stringify([searchTokensArray, fv]);
	var retJson = jSiniTwoPost("SearchProducts", j);
	// the return JSON represents an array of FieldValue objects
	// loop through the array and get each value
	var retArray = new Array();
	$j.each(retJson, function(i,fv){
		retArray[i] = fv.fieldValue;
	});
	return retArray;
}

function SiniSendEmail(fromAddressTemplate, toAddressTemplate, ccAddressTemplate, bccAddressTemplate, 
							messageSubjectTemplate, messageBodyTemplate, orderId, documentId, userId)
{
	var idsFv = new FieldValue(null, orderId, documentId, userId);
	var templateFv1 = new FieldValue(fromAddressTemplate, toAddressTemplate, ccAddressTemplate, bccAddressTemplate);
	var templateFv2 = new FieldValue(messageSubjectTemplate, messageBodyTemplate, null, null);
	var j = JSON.stringify([idsFv, templateFv1, templateFv2]);
	var retJson = jSiniTwoPost("SendEmail", j);
	return retJson.fieldValue;
}

function SiniSubmitDocumentForFinalOutput(documentId)
{
	var fv = new FieldValue(null, null, documentId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("SubmitDocumentForFinalOutput", j);
	return retJson.fieldValue;
}

function SiniUpdateAssetProperties(assetId)
{
	var fv = new FieldValue(null, null, assetId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("UpdateAssetProperties", j);
	return retJson.fieldValue;
}

function SiniUpdateDocumentThumbnail(documentId)
{
	var fv = new FieldValue(null, null, documentId, null);
	var j = JSON.stringify(fv);
	var retJson = jSiniTwoPost("UpdateDocumentThumbnail", j);
	return retJson.fieldValue;
}

function jSiniTwoPost(method, jsonArg)
{
	var params = {};
	params["method"] = method;
	params["jsonArg"] = jsonArg;
    var url = "jSiniTwo.aspx";

	var theVal;
		
	$j.ajax({
		async: false,
		type: "POST",
		url: url,
		data: params,
		dataType: "json",
		success: function(json) {
			theVal = json;
		},
		error: function (xhr, ajaxOptions, thrownError){
			throw ("ERROR! \n" + xhr.responseText);
        }   
	});
	
	return theVal;
}

// our basic class for holding field name/value pairs, and for sending strings to and from the server
function FieldValue(fieldType, fieldName, objectId, fieldValue)
{
	this.fieldType = fieldType;
	this.fieldName = fieldName;
	this.objectId = objectId;
	this.fieldValue = fieldValue;
}

function KeyValuePair(name, value)
{
	this.Name = name; 
	this.Value = value;
}












