window.RiaUtil = {

    jsonFormData: {},

    serviceRoot: "/api",

    httpMethodType: { get: "GET", post: "POST", put: "PUT", del: "DELETE" },

    // to be set on bootstrap
    resourceActionMap: {
        profile_get: {
            action: "/user/profile",
            method: "GET"
        },
        profile_put: {
            action: "/user/profile",
            method: "PUT"
        },
        profile_post: {
            action: "/user/profile",
            method: "POST"
        },
        useruploads_get: {
            action: "/user/uploads",
            method: "GET"
        },
        login_post: {
            action: "/login",
            method: "POST"
        },
        usermedia_get: {
            action: "/user/media",
            method: "GET"
        },
        media_get: {
            action: "/media",
            method: "GET"
        },
        media_post: {
            action: "/media",
            method: "POST"
        },
        media_put: {
            action: "/media",
            method: "PUT"
        },
        moods_get: {
            action: "/lookup/moods",
            method: "GET"
        },
        genres_get: {
            action: "/lookup/genres",
            method: "GET"
        },
        searchartist_get: {
            action: "/search/artist/[name]",
            method: "GET"
        },
        searchaudio_post: {
            action: "/search/audio",
            method: "POST"
        },
        userplaylists_get: {
            action: "/user/playlists",
            method: "GET"
        },
        playlist_get: {
            action: "/playlist?playlistId=[playlistid]",
            method: "GET"
        },
        playlist_post: {
            action: "/user/playlist",
            method: "POST"
        },
        playlistentry_post: {
            action: "/playlist/entry",
            method: "POST"
        },
        playlistentry_del: {
            action: "/playlist/entry",
            method: "DELETE"
        },
        accountvalidation_put: {
            action: "/member/validate-account",
            method: "PUT"
        }
    },

    convertFormToJson: function (frm) {
        var fqfa = this.getFullyQualifiedFormAction(frm);
        this.jsonFormData[fqfa] = {};

        $(':input', frm).each(function (i, item) {
            if ($(item).attr("name") && $(item).attr("name") != "" && $(item).attr("ignoreSerialization") != "true") {
                if ($(item).attr("type") != "checkbox" || ($(item).attr("type") == "checkbox" && item.checked)) {
                    switch ($(item).attr("dataType")) {
                        case "num":
                            RiaUtil.jsonFormData[fqfa][item.name] = Number($(item).val());
                            break;
                        case "bool":
                            RiaUtil.jsonFormData[fqfa][item.name] = ($(item).val().indexOf("true") != -1);
                            break;
                        default:
                            RiaUtil.jsonFormData[fqfa][item.name] = $(item).val();
                            break;
                    }
                }
            }

        });
        return this.jsonFormData[fqfa];
    },

    bindJsonToForm: function (data, resourceName) {
        var formId = "#" + resourceName + "Form";
        if ($(formId).length == 0)
            throw new Error("Form '" + formId + "' could not be located to bind data.");
        for (var prop in data) {
            var val = data[prop] || "";
            $(":input[name='" + prop + "']", $(formId)).val(String(val));
        }
    },

    getResourceAction: function (dataContainer) {
        var resourceName = dataContainer.resourceName || $(dataContainer).attr("resourceName");
        var resourceMethod = dataContainer.resourceMethod || $(dataContainer).attr("resourceMethod");
        return this.resourceActionMap[resourceName.toLowerCase() + "_" + resourceMethod.toLowerCase()];
    },

    getFullyQualifiedFormAction: function (dataContainer) {
        var resourceName = dataContainer.resourceName || $(dataContainer).attr("resourceName");
        return location.href + resourceName;
    },

    formatActionRequestUri: function (requestAction, requestArgs) {
        if (requestArgs) {
            for (var prop in requestArgs) {
                requestAction = requestAction.replace("[" + prop.toLowerCase() + "]", requestArgs[prop]);
            }
            if (requestArgs.pg && requestArgs.pgSz)
                requestAction += "?pg=" + requestArgs.pg + "&pgSz=" + requestArgs.pgSz;
        }
        return this.serviceRoot + requestAction;
    },

    getActionAjaxOptions: function (frmOrRequestData, requestArgs, successCallback, errorCallback) {
        try {
            if (frmOrRequestData.tagName) this.convertFormToJson(frmOrRequestData);
            var rsrcAction = this.getResourceAction(frmOrRequestData);
            if (!rsrcAction) throw new Error("Could not locate resource action.");
            var formattedRequestUri = this.formatActionRequestUri(rsrcAction.action, requestArgs);
            var ajaxOptions = {
                url: formattedRequestUri,
                type: rsrcAction.method,
                data: (frmOrRequestData.tagName) ? JSON.stringify(this.jsonFormData[this.getFullyQualifiedFormAction(frmOrRequestData)]) : JSON.stringify(frmOrRequestData),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: successCallback || this.defaultSuccessCallback,
                error: errorCallback || this.defaultErrorCallback
            }
            return ajaxOptions;
        }
        catch (ex) {
            alert(ex);
        }
    },

    makeRequest: function (options) {
        $.ajax(options);
    },

    defaultSuccessCallback: function (data, status, xhr) {
        var test = "";
    },

    defaultErrorCallback: function (xhr, status, error) {
        try {
            var exception = (xhr.Message) ? xhr : eval("(" + xhr.responseText + ")");
            eval(exception.Message);
        }
        catch (ex) { }
    },

    // Interface Enforcers
    Enforce_IRequestData: function (data) {
        if (!data.resourceName)
            throw new Error("Request data object does not implement the 'resourceName' property.");
        if (!data.resourceMethod)
            throw new Error("Request data object does not implement the 'resourceMethod' property.");
    },

    // FB Console Logging - setup for interoperability across non-supported browsers
    FBDebugPassthrough: function () {
        if (!window.console || !console.firebug) {
            var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
            window.console = {};
            for (var i = 0; i < names.length; ++i) {
                window.console[names[i]] = function () { }
            }
        }
    },

    // Misc Utils
    getCookie: function (cookieName) {
        var a_all_cookies = document.cookie.split(';');
        var a_temp_cookie = '';
        var cookie_name = '';
        var cookie_value = '';
        var b_cookie_found = false; // set boolean t/f default f

        for (i = 0; i < a_all_cookies.length; i++) {
            a_temp_cookie = a_all_cookies[i].split('=');

            cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
            if (cookie_name == cookieName) {
                b_cookie_found = true;
                if (a_temp_cookie.length > 1) {
                    cookie_value = unescape(a_temp_cookie[1].replace(/^\s+|\s+$/g, ''));
                }
                return cookie_value;
                break;
            }
            a_temp_cookie = null;
            cookie_name = '';
        }
        if (!b_cookie_found) {
            return null;
        }
    },


    getQSValue: function (q, key) {
        if (q && q.charAt(0) == "?")
            q = q.substring(1);
        var keyValuePairs = [];
        for (var i = 0; i < q.split("&").length; i++) {
            keyValuePairs[i] = q.split("&")[i];
        }
        for (var j = 0; j < keyValuePairs.length; j++) {
            if (keyValuePairs[j].split("=")[0] == key)
                return unescape(keyValuePairs[j].split("=")[1]);
        }
        return false;
    }

}

/*
IDF.prototype.getAjaxOptions = function(url, data, successCallback, errorCallback) {
    var ajaxOptions = {
        url: this.getUrlPrepend() + url,
        type: "POST",
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: (successCallback) ? successCallback : this.successCallback(data),
        error: (errorCallback) ? errorCallback : this.errorCallback
    }
    return ajaxOptions;
}

IDF.prototype.Authenticate = function(frm, success, fail) {
    $.ajax(
        this.getAjaxOptions(
            this.svc.Authenticate,
            this.getSerializedFormData(frm, this.svc.Authenticate),
            success,
            fail
        )
    );
}

IDF.prototype.getException = function(dataObject) {
    var exception = (dataObject.Message)?dataObject:eval("(" + dataObject.responseText + ")");
    return exception;
}

IDF.prototype.setSessionCookie = function(uid) {
    var COOKIE_NAME = 'IDFSESSIONID';

    var expTime = new Date()
    var curdate = expTime.getTime()
    curdate += this.sessionExpires * 60 * 1000;
    expTime.setTime(curdate)

    //$.cookie(COOKIE_NAME, uid, { path: '/', expires: expTime });
    $.cookie(COOKIE_NAME, uid, { path: '/', expires: -1 });
    return this;
}

IDF.prototype.form2json = function(form, fn, returnAsObject, includeEmptyStringValues) {
    var fn = fn || function(data) { return data; };
    var data = {};

    $("input,select,textarea", form).each(function() {
        var element = $(this);
        if (element.attr("accept") === element.val()) {
			element.val('');
		}
        if ((element.attr("name") != "") && (includeEmptyStringValues || jQuery.trim(element.val()) != "")) {
			if(element.attr("type") != "checkbox"){
				data[element.attr("name")] = (typeof element.val() !== "string") ? element.val() : element.val().stripHTML();
			}
			else{ 
				// console.log("checkbox found");
				if(element.is(':checked') == true){
					// console.log("checkbox checked");
					if(data[element.attr("name")] == null){
						data[element.attr("name")] = [];
					}
					data[element.attr("name")].push(Number(element.val()));
				} 
			}
        }
    });

    data = fn(data);
    return (returnAsObject)?data:JSON.stringify(data);
}

String.prototype.stripHTML = function() {
	// What a tag looks like
	var matchTag = /<(?:.|\s)*?>/g;
	// Replace the tag
	return this.replace(matchTag, "");
}



IDF.prototype.getQuerystringValue = function queryString(key) {
	var page = new PageQuery(window.location.search);
	return unescape(page.getValue(key));
}

// Author: Peter A. Bromberg
QSUtil: function(q) {
	if (q.length > 1) this.q = q.substring(1, q.length);
	else this.q = null;
	this.keyValuePairs = new Array();
	if (q) {
		for (var i = 0; i < this.q.split("&").length; i++) {
			this.keyValuePairs[i] = this.q.split("&")[i];
		}
	}
	this.getKeyValuePairs = function() { return this.keyValuePairs; }
	this.getValue = function(s) {
		for (var j = 0; j < this.keyValuePairs.length; j++) {
			if (this.keyValuePairs[j].split("=")[0] == s)
				return this.keyValuePairs[j].split("=")[1];
		}
		return false;
	}
	this.getParameters = function() {
		var a = new Array(this.getLength());
		for (var j = 0; j < this.keyValuePairs.length; j++) {
			a[j] = this.keyValuePairs[j].split("=")[0];
		}
		return a;
	}
	this.getLength = function() { return this.keyValuePairs.length; }
}
*/
