
function MediaAjaxRequester(formName){
    
    if (formName == null) {
        formName = document.filterForm;
    }
    var queryparams = new Array();
    var result = null;
    var hasError;
    var errorMsg;
    var thisRef = this;
    this.resultListener = null;
    
    this.hasError = function(){
        return hasError;
    }
    
    this.getErrorMessage = function(){			
        return errorMsg;
    }
    
    this.setParameter = function(inKey,inVal){			
        queryparams[inKey] = inVal;			
    }
    
    this.clearParameters = function(){			
        queryparams = null;
        queryparams = new Array();		
    }	
    
    // helper method to retrieve form values
    function getFormValues(theForm) {
        var str = "";
        for(var i = 0;i < theForm.elements.length;i++) {
            if (theForm.elements[i].type != 'checkbox' &&  theForm.elements[i].value != '') {
                var theval = theForm.elements[i].value;
                var navi = navigator.appVersion;
                if(navi.indexOf("MSIE")>-1){
                    theval = Utf8.encode(theval); // correctly encode the string if we are using IE
                }
                str += theForm.elements[i].name + "=" + theval + "&";
            }
            if (theForm.elements[i].type == 'checkbox' && theForm.elements[i].checked) {
                str += theForm.elements[i].name + "=" + theForm.elements[i].value + "&";
            }
        }
        str = str.substr(0,(str.length - 1));
        return str;
    }
    
    var getQueryString = function(){
        var qryString ="";
        qryString = getFormValues(formName);
        return qryString;
    }
    
    this.execute = function(){
        if(this.resultListener == null){
            return;
        }
        var query = getQueryString();
        // alert(query); // only for debugging
        var xml = new JKL.ParseXML( "/ajaxprocessor?" + query );
        var func = this.ajaxfunc;	
        xml.async(func);
        xml.parse();
    }
    
    this.ajaxfunc = function(inXml){		
        var xml = inXml.root;
        result = null;
        
        // set error if xml is not available
        if (xml == null) {
            hasError = true;
            errorMsg = messages.common_errormsg;
        } else {
            
            // set error if xml indicates there is something wrong
            hasError = (xml.result!="OK")?true:false;
            
            if (hasError) {
                if (xml.error != null && xml.error != 'null') {
                    errorMsg = xml.error;
                } else {
                    errorMsg = messages.common_errormsg;
                }
            } else {
                result = new MediaAjaxResult();
                
                //Todo: Adding meta search data				
                if(xml.searchmeta != null){
                    result.setMeta(xml.searchmeta);
                }				
                
                // get the items
                if(xml["items"] == null) {
                    // we have no items
                    result = null;
                } else {

                    var items = new Array();
                    var item, fields, inlines; 	
                    
                    var i,k,lgi;
                    
                    //To figure out if you get zero, one or meny items
                    if(xml.items.item == undefined){
                        try{
                            lgi=xml.items.item.length;
                            lgi=1;
                        }catch(err){
                            lgi = 0;
                        }
                    }else{
                        if(xml.items.item.length == undefined){
                            lgi=1;
                        }else{
                            lgi = xml.items.item.length	
                        }
                    }
                    
                    // if lgi = 0 then we have no results
                    if (lgi <= 0) {
                        // we have items, but it contains no results
                        result = null;
                    } else {
                        for(i=0; i<lgi;i++){
                            
                            item = new MediaAjaxItem();
                            if(lgi==1){
                                fields = xml.items.item;
                            }else{
                                fields = xml.items.item[i];
                            }
                            
                            item.setItemId(fields["id"]);
                            
                            if(fields["inlines"] == undefined){
                                item.setInlineItems(null);
                            }else{
                                
                                inlines = new Array();
                                
                                var lgn = fields["inlines"].item.length;
                                
                                //When length is undefiend then there is one entity
                                if(lgn == undefined) lgn = 1;
                                
                                //Adding inline items for the main items
                                for(var n=0; n<lgn;n++){
                                    var tmpItem;
                                    if(lgn==1){
                                        tmpItem = thisRef.createItem(fields["inlines"].item);
                                    }else{
                                        tmpItem = thisRef.createItem(fields["inlines"].item[n]);
                                    }
                                    inlines[inlines.length] = tmpItem;
                                }
                                
                                item.setInlineItems(inlines);		
                            }
                            
                            //Adding all field names and values to the field array
                            var tmpFields = new Array();
                            var numfields = fields["fields"]["field"].length;

                            //When numfields is undefiend then there is one entity
                            if(numfields == undefined) numfields = 1;
                            for(var m = 0; m<numfields;m++){ 
                                if (numfields==1) {
                                    tmpFields[fields["fields"]["field"]["name"]] = fields["fields"]["field"]["#text"];
                                } else {
                                    tmpFields[fields["fields"]["field"][m]["name"]] = fields["fields"]["field"][m]["#text"];
                                }
                            }
                            
                            item.setFields(tmpFields);
                            
                            //Adding all fieldnames to fieldgroups array
                            var fieldgroups = new Array();
                            for (var k=0;k<fields["fields"]["field"].length;k++) {
                                var fgroup = fields["fields"]["field"][k]["group"];
                                var fname = fields["fields"]["field"][k]["name"];
                                var tmp = new Array();
                                if (fieldgroups[fgroup] == undefined) {
                                    tmp[0] = fname;
                                    fieldgroups[fgroup] = tmp;
                                } else {
                                    tmp = fieldgroups[fgroup];
                                    tmp[tmp.length] = fname;
                                    fieldgroups[fgroup] = tmp;
                                }
                            }
                            item.setFieldGroups(fieldgroups);
                            
                            items[items.length] = item;
                        }
                        result.setItems(items);
                    }
                }
            }
        }
        
        //send result back to the callback function	
        thisRef.resultListener(result);	
        
    } 
    
    this.createItem = function(inItem){
        var item = new MediaAjaxItem();
        item.setItemId(inItem["id"]);
        //adding all field names and values to the field array
        
        var tmpFields = new Array();
        for(var m = 0; m<inItem["fields"]["field"].length;m++){            		
            tmpFields[inItem["fields"]["field"][m]["name"]] = inItem["fields"]["field"][m]["#text"];
        }
        item.setFields(tmpFields);
        return item;
    }
    
    
    this.hasResult = function(){
        if(result == null) return false;		
        return true;
    }	
}

function MediaAjaxResult(){
    var meta;
    var items;
    
    this.setItems = function(inItems){
        items = inItems;
    }
    
    this.setMeta = function(inMeta){
        meta = inMeta;
    }
    
    this.getItems = function(){
        return items;
    }
    
    this.getMeta = function(){
        return meta;
    }
}


// item object, contains item details
function MediaAjaxItem(){
    
    var inlineItems;
    var fields;
    var fieldgroups;
    var itemId;
    
    this.getItemId = function() {
        return itemId;
    }
    
    this.setItemId = function(val) {
        itemId = val;
    }
    
    this.setField = function(fieldname,val) {
        fields[fieldname] = val;
    }
    
    this.getFieldByName = function(val,limitTaxonomyValues) {
        if (limitTaxonomyValues != null && (val == 'genre' || val == 'console')) {
            var myVal = this.getFieldByName(val);
            var valArr = myVal.split(", ");
            var totalVals = valArr.length; 
            if (valArr.length > limitTaxonomyValues ) {
                totalVals = limitTaxonomyValues;
            }
            var newVal = "";
            for (var i=0;i<totalVals;i++) {
                newVal += valArr[i] + ", "
            }
            
            newVal = newVal.substr(0,newVal.length-2);
            /*
            if (valArr.length > limitTaxonomyValues) {
                newVal = newVal + "...";
            }
            */
            return newVal;
        } else {
            return fields[val];
        } 
    }

    this.getFields = function() {
        return fields;
    }
    
    this.setFields = function(inFields) {
        fields = inFields;
    }
    
    this.getFieldNamesByGroup = function(val) {
        return fieldgroups[val];
    }
    
    this.setFieldGroups = function(inGroups) {
        fieldgroups = inGroups;
    }
    
    this.getFieldGroups = function(inGroups) {
        return fieldgroups;
    }
    
    this.getInlineItems = function() {
        return inlineItems;
    }
    
    this.setInlineItems = function(items) {
        inlineItems = items;
    }
    
    this.addInlineItem = function(item) {
        //inlineItems[inlineItems.length] = item;        
    }
    
}

