if (typeof POLAR == 'undefined' || !POLAR) {
    var POLAR = {};
}

//--------------------------------------------------------------------------
// POLAR.Authorization 
//--------------------------------------------------------------------------
POLAR.Authorization = function() {
	this.permissions = [];
	// concat messed up uri arrays into one permissions array
	this.permissions = this.permissions.concat(UserResourcePermissions.NewResourceCreators, UserResourcePermissions.ResoruceTemplatePermissions, UserResourcePermissions.ResorucePermissions, UserResourcePermissions.UserDefineResorucePermissions);
};

POLAR.Authorization.prototype = {
    // Takes uri template and matches it to permissions.
    // Examples: 
    //	"/incident/{id}/team/{teamid}" returns "/incident/{id}/team/7" if there is permission "/incident/{id}/team/7"
    //  "/incidents/team/{teamid}" returns "/incidents/team/7;8" if there is permission "/incidents/team/7" and "/incidents/team/8"
    //  "/incident" returns "/incident"
    matchTemplateAndAggregate: function(uriTemplate, templateKeyword) {
        var _this = this;

        uriTemplate = uriTemplate.toLowerCase();
        templateKeyword = "{" + templateKeyword.toLowerCase() + "}";

        var url = "";
        var values = [];
        var templateSegments = _this.getUriSegments(uriTemplate);
        var templateMatchFound = false;

        $.each(_this.permissions, function(permissionKey, permissionVal) {
            if (permissionVal.GET) {
                var permissionSegments = _this.getUriSegments(permissionVal.URN);

                if (templateSegments.length == permissionSegments.length) {
                    var segmentsMatch = true;
                    $.each(templateSegments, function(segmentKey, segmentVal) {
                        if (-1 == segmentVal.indexOf('{')) {
                            if (templateSegments[segmentKey] != permissionSegments[segmentKey]) {
                                segmentsMatch = false;
                                return false;
                            }
                        }
                    });

                    if (segmentsMatch) {
                        // aggregate values to create uri array if neaded (/incidents/team/7;8)
                        $.each(templateSegments, function(segmentKey, segmentVal) {
                            if (templateKeyword == segmentVal) {
                                values.push(permissionSegments[segmentKey]);
                                return false;
                            }
                        });

                        templateMatchFound = true;
                    }
                }
            }
        });

        if (templateMatchFound) {
            // create url from segments and extracted id values
            $.each(templateSegments, function(segmentKey, segmentVal) {
                if (templateKeyword == segmentVal) {
                    var valuesWithoutDuplicates = [];
                    $.each(values.join(";").split(";"), function(valuesKey, valuesVal) {
                        if (-1 == $.inArray(valuesVal, valuesWithoutDuplicates)) {
                            valuesWithoutDuplicates.push(valuesVal);
                        }
                    });

                    url += "/" + valuesWithoutDuplicates.join(";");
                }
                else {
                    url += "/" + segmentVal;
                }
            });

            return url;
        } else {
            return "";
        }
    },
    // Takes uri template array and matches them one by one to all the permissions. First template that is succesfully matched will be returned.
    // Examples: 
    //  ["/incidents", "/incidents/team/{teamid}"] returns "/incidents/team/7;8" if there is permission "/incidents/team/7" and "/incidents/team/8"
    getFirstValidUriBasedOnTemplates: function(uriTemplates, templateKeyword) {
        var _this = this;

        var url = "";
        $.each(uriTemplates, function(templateKey, templateVal) {
            url = _this.matchTemplateAndAggregate(templateVal, templateKeyword);
            if (url != "") {
                return false;
            }
        });

        return url;
    },
    getUriSegments: function(uri) {
        if (uri.charAt(0) != "/") {
            uri = "/" + uri;
        }

        return $.url.setUrl(uri).segmentsArray();
    },

    // check if we can create a resource on uri, it goes through UserResourcePermissions.NewResourceCreators searching for a match on URN
    isCreateResourceAllowed: function(resourceUri) {
        var matchFound = false;
        $.each(UserResourcePermissions.NewResourceCreators, function() {
            if (this.URN == resourceUri) {
                matchFound = true;
                return false; // $.each break
            }
        });
        return matchFound;
    },

    // check if we can access a resource on uri, does not resolve template values so param /incident/2 will not match /incident/{id}
    isGetResourceAllowed: function(resourceUri) {
        var matchFound = false;
        $.each(
            this.permissions,
            function(permissionKey, permissionVal) {
                if (permissionVal.URN == resourceUri && permissionVal.GET) {
                    matchFound = true;
                    return false; // $.each break
                }
            }
        );
        return matchFound;
    }
};

			
			

// funkcija koja slui kao toggle na elemetima da se prikau, sakriju
function hideshow(which) {
    if (!document.getElementById)
        return
    if (which.style.display == "block")
        which.style.display = "none"
    else
        which.style.display = "block"
}

POLAR.View = function() {
};
POLAR.Widget = function() {
};
POLAR.Util = function() {
};

// helper function to use in jQuery selector when having javascript experssion
// usage: $(POLAR.Util.jqIdFormat(you + can + combine + strings + to + form + id))
POLAR.Util.jqIdFormat = function(myid) {
    return '#' + myid.replace(/:/g, "\\:").replace(/\./g, "\\.");
}

// associate object with the element.
POLAR.View.setContainedObject = function(element, obj) {
    if(YAHOO.lang.isString(element))
        return YAHOO.util.Dom.get(element).containedObject = obj;
    else
        element.containedObject = obj;
};

// get the object associated with the element.
POLAR.View.getContainedObject = function(element) {
    if(YAHOO.lang.isString(element)) {
        var element = YAHOO.util.Dom.get(element);
        if(!YAHOO.lang.isUndefined(element) && !YAHOO.lang.isNull(element)) {
            if(!YAHOO.lang.isUndefined(element.containedObject) && !YAHOO.lang.isNull(element.containedObject)) {
                return element.containedObject;
            }
        }
    }
    else {
        if(!YAHOO.lang.isUndefined(element.containedObject) && !YAHOO.lang.isNull(element.containedObject)) {
            return element.containedObject;
        }
    }

    return null;
};

POLAR.View.setDataTableRowReader = function(element, obj) {
    if(YAHOO.lang.isString(element))
        return YAHOO.util.Dom.get(element).dataTableRowReader = obj;
    else
        element.dataTableRowReader = obj;
};

POLAR.View.getDataTableRowReader = function(element) {
    if(YAHOO.lang.isString(element))
        return YAHOO.util.Dom.get(element).dataTableRowReader;
    else
        return element.dataTableRowReader;
};

POLAR.View.mapElementValueToProperty = function(element, property, propertyName) {
    if('INPUT' == element.tagName && 'checkbox' == element.type) {
        property[propertyName] = element.checked;
    }
    else if(!YAHOO.lang.isNull(tinyMCE.activeEditor) && 'TEXTAREA' == element.tagName && 'textarea' == element.type) {
		property[propertyName] = tinyMCE.activeEditor.getContent({format : 'raw'});
	}
    else {
        property[propertyName] = element.value;
    }
};

POLAR.View.walkThroughSubObjects = function(obj, path) {
    if(YAHOO.lang.isObject(obj)) {
        for (var name in obj) {
            var subObj = obj[name];

            if(YAHOO.lang.isObject(subObj)) {
                POLAR.View.walkThroughSubObjects(subObj, path + '.' + name);
            }
            else {
                var element = YAHOO.util.Dom.get(path + '.' + name);
                if(!YAHOO.lang.isNull(element)) {
                    POLAR.View.mapElementValueToProperty(element, obj, name);
                }
            }
        }
    }
};

/*Save, PUT, POST */
POLAR.View.serializeData = function() {
    for (var propertyName in resource) {
        if (YAHOO.lang.isArray(resource[propertyName])) {

            // always assume YUI DataTable when someone passes an array.
            var dataTable = POLAR.View.getContainedObject(propertyName);
            if (null != dataTable) {
                var recordSet = dataTable.getRecordSet();
                resource[propertyName] = new Array();

                for (var index = 0; index < recordSet.getLength(); index++) {
                    var record = recordSet.getRecord(index).getData();
                    resource[propertyName][index] = POLAR.View.getDataTableRowReader(propertyName)(record);
                }
            }
            else { //TODO implement otker storage than YUI grid -> native Arrat width unordered list <ul>, maybe            
            }
        }
        else {
            var subProperty = resource[propertyName];
            if (YAHOO.lang.isObject(subProperty)) {
                POLAR.View.walkThroughSubObjects(subProperty, propertyName);
            }
            else {
                var element = YAHOO.util.Dom.get(propertyName);
                if (!YAHOO.lang.isNull(element)) {
                    POLAR.View.mapElementValueToProperty(element, resource, propertyName);
                }
            }
        }
    }

    YAHOO.lang.JSON.useNativeStringify = false; //Must force use YUI JavaScript implementation of stringify becouse IE8 have BUG in converting JS object in JSON string
    var newResRepr = POLAR.View.clearExtraJSResRepForPUTandDELETE(resource); //MUST be here because ind POLAR.View.mapElementValueToProperty some null property assagnije empty string ""
    var res = YAHOO.lang.JSON.stringify(newResRepr);
    return res;
};

POLAR.View.disableableCheckBoxFormatter = function(cell, record, column, data) {
    var checked = (data) ? ' checked' : '';
    var disabled = !record.getData()['Allow' + column.key] ? 'disabled' : '';

    if('' != disabled)
        checked = '';

    if('' == disabled)
        cell.innerHTML = '<input type="checkbox"' + checked + ' class="' + YAHOO.widget.DataTable.CLASS_CHECKBOX + '" ' + disabled + '>';
};

POLAR.View.checkBoxFormatter = function(cell, record, column, data) {
    var checked = (data) ? ' checked' : '';
    cell.innerHTML = '<input type="checkbox"' + checked + ' class="' + YAHOO.widget.DataTable.CLASS_CHECKBOX + '">';
};

POLAR.View.disableableCheckBoxOnClick = function(args) {
    var checkbox = args.target;
    var column = this.getColumn(this.getTdEl(checkbox));
    var record = this.getRecord(checkbox);
    record.getData()[column.key] = checkbox.checked;
};

POLAR.View.isAyncResponseSuccess = function(request) {
	try {
	    if (request.status == 200 || request.status == 201)
		    return true;
	    else
		    POLAR.View.setAsyncResponseMessage(request);
    }
    catch (e) {
	    POLAR.View.setAsyncResponseMessage(request);
    }

    return false;
}

POLAR.View.asyncResponseFailure = function(request) {
    //YAHOO.WorkingBox.wait.hide();
    POLAR.View.setAsyncResponseMessage(request);    
}

POLAR.View.setAsyncResponseMessage = function(request) {   
    try {
        if (request.status == 200 || request.status == 201) {
            try {
                POLAR.View.AddDataToMessageBoxData(resource.LabelsCommon.OperationSuccess);
            }
            catch (e) {
                POLAR.View.AddDataToMessageBoxData("Operation Success");
            }            
            POLAR.View.Events.triggerOnResourceSavedEvents();
        }
        else if (request.status == 400) {
            try {
                var response = YAHOO.lang.JSON.parse(request.responseText);
                if (response.Errors.length > 0) {
                    for (var n = 0; n < response.Errors.length; n++) {
                        POLAR.View.AddDataToMessageBoxData(response.Errors[n]);
                    }
                }
            }
            catch (e) {
                POLAR.View.AddDataToMessageBoxData("Error in response.Errors object");
            }
        }
        else if (request.status == 500) {
            try {
                var response = YAHOO.lang.JSON.parse(request.responseText);
                POLAR.View.AddDataToMessageBoxData(resource.LabelsCommon.InternalServerError + ": " + response.Errors[0]);               
            }
            catch (e) {
                POLAR.View.AddDataToMessageBoxData("Internal Server Error.");
            }                
        }
        else {            
            POLAR.View.AddDataToMessageBoxData('Unrecognized response. HTTP response: ' + 'ReadyState:' + request.readyState + '; StatusText: ' + request.statusText + '; Status: ' + request.status + '; responseText: ' + request.responseText);
        }
    }
    catch (ex) {        
        POLAR.View.AddDataToMessageBoxData("<pre>" + 'Javascript error: ' + ex + "</pre>");
    }
}

POLAR.View.addToMessageBox = function(text) {
    var messageBoxElement = YAHOO.util.Dom.get('messagebox');
    var textElement = document.createElement('pre');

    $(textElement).text(text);    
    // remove all child nodes
    /*//SP:08022009: while (messageBoxElement.hasChildNodes()) {
        //SP:08022009: messageBoxElement.removeChild(messageBoxElement.lastChild);
    }*/
    //$('#messagebox').empty();

    messageBoxElement.appendChild(textElement);
	$("#messagebox").show();
}

POLAR.View.addToMessageBoxOnErrorPage = function(text, exception, stacktrace, url) {
    var messageBoxElement = YAHOO.util.Dom.get('messagebox');

    // remove all child nodes
    /*//SP:08022009: while (messageBoxElement.hasChildNodes()) {
        //SP:08022009: messageBoxElement.removeChild(messageBoxElement.lastChild);
    }*/
    //$('#messagebox').empty();

    var textElement = document.createElement('p');
    $(textElement).text(text);
    messageBoxElement.appendChild(textElement);

    messageBoxElement.appendChild(document.createElement('br'));

    var excElement = document.createElement('p'), stTr = document.createElement('pre');

    $(excElement).text("Error message: " + exception);
    messageBoxElement.appendChild(excElement);
    messageBoxElement.appendChild(document.createElement('br'));

    $(stTr).text(stacktrace);
    messageBoxElement.appendChild(stTr);
    messageBoxElement.appendChild(document.createElement('br'));

    var urlEl = document.createElement('p');
    $(urlEl).text("URL = " + url);
    messageBoxElement.appendChild(urlEl);

    $("#messagebox").show();
}

//Add data to global varable messageBoxData. This data we use to show in Message Box and Message Dialog
POLAR.View.AddDataToMessageBoxData = function(data) {
    if (!YAHOO.lang.isUndefined(data) && !YAHOO.lang.isNull(data)) {
        //messageBoxData.unshift(data);
        messageBoxData.push(data);
    }
    if (messageBoxData.length > 0) {
        $("#openMessageDialog").show();
        $("#numberOfMessage").remove();
        $('#openMessageDialog').before("<span id='numberOfMessage'>(" + messageBoxData.length + ") </span>");
        //$("#messagebox").show();
        $("#messagebox").empty();
        //show first only line
        //charCodeAt()
        /*var index = text.indexOf("\n");        
        var text2 = "";
        if (index == -1) {
        text2 = text.substring(0, Math.min(150, text.length)) + "...";
        }
        else {
        text2 = text.substring(0, Math.min(150, index)) + "...";  //text2 = text.substring(0, index);
        }*/
        var text = messageBoxData[messageBoxData.length - 1];
        var text2 = text.substring(0, Math.min(150, text.length));
        if (text.length > 150) {
            text2 = text2 + " ...";
        }
                
        $('#messagebox').append(text2);
        $('#messagebox').show();

        //stop animation
        //$("#messagebox").stop();// - is not working - http://stackoverflow.com/questions/1427678/jquery-interrupt-animation
        //stop executing current timer
        clearTimeout(messageBoxData.timeoutId);
        //wait x second and start fadeOut        
        messageBoxData.timeoutId = setTimeout(
            function() {
                $("#messagebox").fadeOut(1000,
                    function() {
                        $("#messagebox").hide();
                    }
                );
            }
            , 20000
        );
    }
}

//This function we call for begining on executing javascritp on ever web page  in $(document).ready(function() {}
POLAR.View.CheckForExtraInfo = function() {
    //inicialize Messages Dialog
    $("#openMessageDialog").hide();
    
    function messageBoxDialogHandler() {
        if ($("#messageBoxDialog").dialog('isOpen') == true) {
            $("#messageBoxDialog").dialog('close');
        }
        $("#messageBoxDialog").dialog('destroy');
        $.ui.dialog.defaults.bgiframe = true;
        $('#messageBoxDialog').empty();
        /*var dialogWidth = 300;        var dialogHeight = 300;        var sizeID = [];*/

        for (var i = 0; i < messageBoxData.length; i++) {
            var idx = "xxx" + i.toString();
            //sizeID.push(idx);            //var LineWrapping = /(\n\r|\n|\r)/gm;        //var htmlText = messageBoxData[i].replace(LineWrapping, '<br />');
            $('#messageBoxDialog').append("<p class='messageDelimiter'></p>");
            $('#messageBoxDialog').append("<p" + " id=" + idx + " class='preMessageBoxDialog'>" + messageBoxData[i] + '</p>');
        }

        $("#messageBoxDialog").dialog({ minHeight: 200, minWidth: 300, width: ($(window).width() / 2), height: ($(window).height() / 2), autoOpen: false, position: 'top' });
        $('#messageBoxDialog').dialog('open');

        /*dialogWidth = 0;        dialogHeight = 0;
        for (var i = 0; i < sizeID.length > 0; i++) {        
        dialogWidth = Math.max(dialogWidth, $("#" + sizeID[i]).width());
        dialogHeight = dialogHeight + $("#" + sizeID[i]).height();
        }        
        $('#messageBoxDialog').dialog('option', 'height', dialogHeight );
        $('#messageBoxDialog').dialog('option', 'width', dialogWidth);
        $('#messageBoxDialog').dialog('option', 'position', 'top');
        $('#messageBoxDialog').dialog('option', 'title', dialogHeight +"--"+ dialogWidth + "---" + sizeID.length ); */
    }

    $('#openMessageDialog').click(function(event) {
        messageBoxDialogHandler();
    });

    $('#messagebox').click(function(event) {
        messageBoxDialogHandler();
    });
    

    if (YAHOO.lang.isUndefined(resource) || YAHOO.lang.isNull(resource)) {
        POLAR.View.AddDataToMessageBoxData("typeof (resource) == 'undefined' - TODO: we not yet implement resource here");
        return;
    }

    if (YAHOO.lang.isUndefined(resource.Errors) || YAHOO.lang.isNull(resource.Errors)) {
        POLAR.View.AddDataToMessageBoxData("resource.Errors == null - TODO: we not yet implement in JSONu Error list ");
        if (YAHOO.lang.isUndefined(resource.Messages) || YAHOO.lang.isNull(resource.Messages)) {
            POLAR.View.AddDataToMessageBoxData("resource.Messages == null - TODO: we not yet implement in JSONu Messages list ");
        }
        return;
    }

    if (resource.Errors.length > 0) {
        for (var n = 0; n < resource.Errors.length; n++) {
            if (resource.Errors[n].length > 0) {
                POLAR.View.AddDataToMessageBoxData(resource.Errors[n]);
            }
        }
    }

    if (YAHOO.lang.isUndefined(resource.Messages) || YAHOO.lang.isNull(resource.Messages)) {
        POLAR.View.AddDataToMessageBoxData("resource.Messages == null - TODO: we not yet implement in JSONu Messages list ");
    }
    if (resource.Messages.length > 0) {
        for (var n = 0; n < resource.Errors.length; n++) {
            if (resource.Errors[n].length > 0) {
                POLAR.View.AddDataToMessageBoxData(resource.Messages[n]);
            }
        }
    }
    var personPreferenceHelper = new PersonPreferenceHelper(resource);
}

/* http post/delete/put/get methods
    these methods help us deal with displaying error messages on the page should the request not complete succesfully.
*/
POLAR.View.convertAsyncResponseToObject = function (response) {
    if(0 != response.responseText.length)
        return YAHOO.lang.JSON.parse(response.responseText);
    else
        return response.responseText;
}

POLAR.View.asyncGet = function (url, delegate) {
	var responseSuccess = function(response) {
        if(POLAR.View.isAyncResponseSuccess(response)) {
            delegate(POLAR.View.convertAsyncResponseToObject(response));
	    }
    }

    var callback = {
        success:responseSuccess,
        failure:POLAR.View.asyncResponseFailure
    };

    YAHOO.util.Connect.asyncRequest('GET', url, callback, '');
};

//use this method for asyncRequest on DELETE with showing message if suksecull adn if we get some error
POLAR.View.asyncStandardDelete = function(url) {
    var transaction = YAHOO.util.Connect.asyncRequest('DELETE', url, POLAR.View.requestCallback, '');
}
//use this method for asyncRequest on PUT with showing message if suksecull adn if we get some error
POLAR.View.asyncStandardPut = function(url) {
    var transaction = YAHOO.util.Connect.asyncRequest('PUT', url, POLAR.View.requestCallback, '');
}
        
POLAR.View.asyncDelete = function (url, delegate) {
	var responseSuccess = function(response) {
        if(POLAR.View.isAyncResponseSuccess(response)) {
            delegate(POLAR.View.convertAsyncResponseToObject(response));
	    }
    }

    var callback = {
        success:responseSuccess,
        failure:POLAR.View.asyncResponseFailure
    };

    YAHOO.util.Connect.asyncRequest('DELETE', url, callback, '');
};

// if data is javascript object, it will be converted to json. otherwise, it will be sent as is.
POLAR.View.asyncPut = function (url, data, delegate) {
	var responseSuccess = function(response) {
        if(POLAR.View.isAyncResponseSuccess(response)) {
            delegate(POLAR.View.convertAsyncResponseToObject(response));
	    }
    }

    var callback = {
        success:responseSuccess,
        failure:POLAR.View.asyncResponseFailure
    };

    if(YAHOO.lang.isObject(data)) {
        data = YAHOO.lang.JSON.stringify(data);
    }

    YAHOO.util.Connect.asyncRequest('PUT', url, callback, data);
};

POLAR.View.asyncPost = function (url, data, delegate) {
	var responseSuccess = function(response) {
        if(POLAR.View.isAyncResponseSuccess(response)) {
            delegate(POLAR.View.convertAsyncResponseToObject(response));
	    }
    }

    var callback = {
        success:responseSuccess,
        upload:responseSuccess,
        failure:POLAR.View.asyncResponseFailure
    };

    if(YAHOO.lang.isObject(data)) {
        data = YAHOO.lang.JSON.stringify(data);
    }

    YAHOO.util.Connect.asyncRequest('POST', url, callback, data);
};


/*
* Set POST HTTP request without writing message in messagebox. We use this for personpreference AJAX request and similan activiti whic happen in backround
* @param {string} url - URL on whic we excute POST method
* @param {object | string} data - object whic we send to server over url with POST method. If this data is object we translate to JSON string with  YAHOO.lang.JSON.stringify(data);
* @param {function} handler - handler Function called when POST method finished
*/
/*
POLAR.View.postSilenceAsynchronous = function(url, data, handler) {
    
    var responseHandler = function(response) {
        //handler(POLAR.View.convertAsyncResponseToObject(response));
        if (0 != response.responseText.length) {
            handler(YAHOO.lang.JSON.parse(response.responseText));
        }
        else {
            handler(response.responseText);
        }
    }

    var callback = {
        success: responseHandler,
        upload: responseHandler,
        failure: responseHandler
    };

    if (YAHOO.lang.isObject(data)) {
        data = YAHOO.lang.JSON.stringify(data);
    }

    YAHOO.util.Connect.asyncRequest('POST', url, callback, data);
};
//----------------------------------------------------------
/**
* Reconstitute Date instances from the default JSON UTC serialization.
* Reference this from a reviver function to rebuild Dates during the
* parse operation.
*
* @method stringToDate
* @param str {String} String serialization of a Date
* @return {Date} or incoming str varijable if can not match
*/
POLAR.Util.stringToDate = function (str) {
        var m = str.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{0,60}))?Z$/);
        if (m) {
            var d = new Date();
            d.setUTCFullYear(m[1], m[2] - 1, m[3]);            
            //firs cut milli seconds to integer, between 0 and 999,
            if (m[7]) {
                if (m[7].length > 3) {
                    m[7] = m[7].substr(0, 3);
                }
            }
            d.setUTCHours(m[4], m[5], m[6], (m[7] || 0));
            return d;
        }
        return str;
    }
    
//----------------------------------------------------------
    //Objekt for silent AJAX, without write anything in messagebox
POLAR.View.SilenceAJAX = function(httpMethod, url, data, successHandler, failureHandler) {

    // Turn anything that looks like a UTC date string into a Date instance
    var revive = function(k, v) {
        if (typeof v === 'string') {
            return POLAR.Util.stringToDate(v);            
            //return POLAR.View.DateTime.stringToDate(v);//bad implementation
        }
        return v;
    }

    var successResponseHandler = function(response) {
        //handler(POLAR.View.convertAsyncResponseToObject(response));
        if (YAHOO.lang.isFunction(successHandler) == false) {
            return;
        }

        try {
            if (0 != response.responseText.length) {
                YAHOO.lang.JSON.useNativeStringify = false;
                YAHOO.lang.JSON.useNativeParse = false;
                //transfor JSON string tu JavaScript object and over revive fucntion transer UTC date to Javascript Date object                
                var obj = YAHOO.lang.JSON.parse(response.responseText, revive);
                successHandler(obj);                
            }
            else {
                successHandler(null);
            }
        }
        catch (e) { //if something go wrong return null in silent
            successHandler(null);
        }
    }

    var failureResponseHandler = function(response) {        
        if (YAHOO.lang.isFunction(failureHandler) == false) {
            return;
        }

        try {
            if (0 != response.responseText.length) {
                YAHOO.lang.JSON.useNativeStringify = false;
                YAHOO.lang.JSON.useNativeParse = false;
                var obj = YAHOO.lang.JSON.parse(response.responseText, revive);                
                failureHandler(obj); //transfor JSON string tu JavaScript object            
            }
            else {
                failureHandler(null);
            }
        }
        catch (e) { //if something go wrong return null in silent
            failureHandler(null);
        }
    }

    //if "data" javascript object then transform it in JSON string
    if (YAHOO.lang.isObject(data)) {
        YAHOO.lang.JSON.useNativeStringify = false;
        YAHOO.lang.JSON.useNativeParse = false;
        data = YAHOO.lang.JSON.stringify(data);
    }
    var callback = {
        success: successResponseHandler,
        failure: failureResponseHandler,
        argument: {}
    };

    YAHOO.util.Connect.asyncRequest(httpMethod, url, callback, data);
}
//----------------------------------------------------------
POLAR.View.asyncUpload = function (form, url, delegate) {
	var responseSuccess = function(response) {
        delegate(response);
    }

    var callback = {
        upload:responseSuccess,
        failure:POLAR.View.asyncResponseFailure
    };

	YAHOO.util.Connect.setForm(form, true);
    YAHOO.util.Connect.asyncRequest('POST', url, callback);
};

POLAR.View.getElementByClassName = function(name, node) {
    var ele = YAHOO.util.Dom.getElementsByClassName(name, null, node)[0];
    if (null == ele || YAHOO.lang.isUndefined(ele))
        return null;
    else
        return ele;
};

POLAR.View.getTemplateAndClearNode = function(name, node) {
    var templateNode = POLAR.View.getElementByClassName(name, node);
    var template = templateNode.cloneNode(true);

    templateNode.parentNode.removeChild(templateNode);
    return template;
};

/* Show Conversation of Incident primary in incident/{ID}*/
POLAR.View.Conversation = function(rootEl, conversation) {
    this.rows = POLAR.View.getElementByClassName('ps-conversation-rows', rootEl);
    this.template = POLAR.View.getTemplateAndClearNode('ps-conversation-template', rootEl);

    for (var n = 0; n < conversation.Items.length; n++) {
        //var i = 0;
        var value = conversation.Items[n];
        this.addRow(value);
    }
};

POLAR.View.Conversation.prototype = {
    addRow: function(entry, first) {
        if (entry.Resolution.length == 0 && entry.Description.length == 0 && entry.Attachments.length == 0) {
            return;
        }

        var node = this.template.cloneNode(true);
        node.style.visibility = 'visible';

        var postedByName = POLAR.View.getElementByClassName('ps-conversation-postedby-name', node);
        var postedByURN = POLAR.View.getElementByClassName('ps-conversation-postedby-urn', node);

        postedByName.innerHTML = entry.PostedBy.Name;
        postedByURN.href = BASE_URL + entry.PostedBy.URN;

        var postedOn = POLAR.View.getElementByClassName('ps-conversation-postedon', node);
        postedOn.innerHTML = POLAR.View.DateTime.dateToString(Date.parse(entry.PostedOn));

        // strip html /<\/?[^>]+(>|$)/g
        // test for html if (/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)<\/\1>/gi.test(entry.Description)) {
        // strip script tags /<script.*?>.*?<\/script>/gi
        if ('' != YAHOO.lang.trim(entry.Description)) {
            var description = POLAR.View.getElementByClassName('ps-conversation-description', node);
            var text = entry.Description;
            if (!/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)<\/\1>/gi.test(text)) {
                text = text.replace(/(\r\n|[\r\n])/g, "<br />");
            }
            description.innerHTML = text.replace(/<script.*?>.*?<\/script>/gi, '');
        }
        else {
            var container = POLAR.View.getElementByClassName('ps-conversation-description-container', node);
            container.parentNode.removeChild(container);
        }

        if ('' != YAHOO.lang.trim(entry.Resolution)) {
            var resolution = POLAR.View.getElementByClassName('ps-conversation-resolution', node);
            var text = entry.Resolution;
            if (!/<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)<\/\1>/gi.test(text)) {
                text = text.replace(/(\r\n|[\r\n])/g, "<br />");
            }
            resolution.innerHTML = text.replace(/<script.*?>.*?<\/script>/gi, '');
        }
        else {
            var container = POLAR.View.getElementByClassName('ps-conversation-resolution-container', node);
            container.parentNode.removeChild(container);
        }

        if (entry.Attachments.length > 0) {
            var attachments = POLAR.View.getElementByClassName('ps-conversation-attachments', node);
            var addSeparator = false;
            var attachmentHtml = '';
            for (var n = 0; n < entry.Attachments.length; n++) {
				if(undefined !== entry.Attachments[n]) {
					if (addSeparator)
						attachmentHtml += ', ';
					else
						addSeparator = true;
				
					if (undefined === entry.Attachments[n].URN) 
						attachmentHtml += '&lt;<a href="' + BASE_URL + 'attachment/' + entry.Attachments[n].GUID + '">' + entry.Attachments[n].Name + '</a>&gt;';
					else
						attachmentHtml += '&lt;<a href="' + BASE_URL + entry.Attachments[n].URN + '">' + entry.Attachments[n].Name + '</a>&gt;';
                }
            }

            attachments.innerHTML = attachmentHtml;
        }
        else {
            var container = POLAR.View.getElementByClassName('ps-conversation-attachments-container', node);
            container.parentNode.removeChild(container);
        }

        if (undefined === first) {
            this.rows.appendChild(node);
        }
        else {
            $(this.rows).prepend(node);
        }
    }
}

/* TranslationTable */

POLAR.View.TranslationTable = function(root, schema) {
    this._rowsEle = POLAR.View.getElementByClassName('ps-translationtable-rows', root);
    this._rowTemplate = POLAR.View.getTemplateAndClearNode('ps-translationtable-row', root);
    this._translationEle = POLAR.View.getElementByClassName('ps-translationtable-translation', root);
    this._fields = new Array();

    for (var n = 0; n < schema.length; n++) {
        var value = schema[n];

        if(undefined != value.method && '' != value.method) {
            this.addRow(value.to, value.method);
        }
        else {
            this.addRow(value.to);
        }
    }

    this.load();
};

POLAR.View.TranslationTable.prototype = {
    addRow: function(helpdeskText, methodText) {
        var node = this._rowTemplate.cloneNode(true);
        node.style.visibility = 'visible';

        var helpdeskEle = POLAR.View.getElementByClassName('ps-translationtable-helpdeskfield', node);
        helpdeskEle.value = helpdeskText;

        var _this = this;
        YAHOO.util.Event.addListener(helpdeskEle, 'keyup', function() {
            _this.generateJson();
        });

        var activeDirectoryEle = POLAR.View.getElementByClassName('ps-translationtable-activedirectoryfield', node);

        YAHOO.util.Event.addListener(activeDirectoryEle, 'keyup', function() {
            _this.generateJson();
        });

        var methodsEle = POLAR.View.getElementByClassName('ps-translationtable-methods', node);
        var domainNameEle = POLAR.View.getElementByClassName('ps-translationtable-domainname', node);
        var automaticDomainNameDetectionEle = null;//POLAR.View.getElementByClassName('ps-translationtable-automaticdomainnamedetection', node);

        if (undefined != methodText) {
            methodsEle.style.visibility = 'visible';
            YAHOO.util.Event.addListener(domainNameEle, 'keyup', function() {
                _this.generateJson();
            });
        }

        this._fields.push({ helpdeskEle: helpdeskEle, activeDirectoryEle: activeDirectoryEle, domainNameEle: domainNameEle, automaticDomainNameDetectionEle: automaticDomainNameDetectionEle });
        this._rowsEle.appendChild(node);
    },

    generateJson: function() {
        var data = new Object();
        data.Version = 1;
        data.Translations = new Array();

        for (var n = 0; n < this._fields.length; n++) {
            var value = this._fields[n];

            var from = value.activeDirectoryEle.value.replace(/^\s+|\s+$/, '');
            var to = value.helpdeskEle.value.replace(/^\s+|\s+$/, '');
            var method = "";
            
            if (undefined != value.domainNameEle) {
                method = value.domainNameEle.value;
            }

            if (undefined != value.automaticDomainNameDetectionEle && value.automaticDomainNameDetectionEle.checked) {
                method = 'AddDomainPrefix';
            }

            if ('' != from) {
                data.Translations.push({ From: from, To: to, Method: method });
            }
        }

        this._translationEle.value = YAHOO.lang.JSON.stringify(data);
    },

    load: function() {
        if('' != this._translationEle.value) {
            try {
                var data = YAHOO.lang.JSON.parse(this._translationEle.value);

                for (var n = 0; n < data.Translations.length; n++) {
                    var value = data.Translations[n];

                    var field = this.findField(value.To);
                    if(undefined != field) {
                        field.helpdeskEle.value = value.To;
                        field.activeDirectoryEle.value = value.From;

                        /*if(value.Method == 'AddDomainPrefix') {
                            field.automaticDomainNameDetectionEle.checked = true;
                            field.domainNameEle.readOnly = true;
                        }
                        else {
                            field.automaticDomainNameDetectionEle.checked = false;
                            field.domainNameEle.readOnly = false;*/
                            if("" != value.Method) {
                                field.domainNameEle.value = value.Method;
                            }
                        //}
                    }
                }
            } catch(ex) {}
        }

        this.generateJson();
    },

    findField: function(field) {
        for (var n = 0; n < this._fields.length; n++) {
            var value = this._fields[n];

            if(value.helpdeskEle.value == field) {
                return value;
            }
        }
    }
};

//------------------------------------------------------------
/* LinkedEntity2 */
//------------------------------------------------------------
POLAR.Widget.LinkedEntity2 = function(linkID, propertyName, subResource, resourceHolder) {
    //propertyName - je npr. "Contact" a to je unutar JSON objekta, tj. resoruce, tj. JS objekta /incidetn.Contact pod objekt na kojega pokazuje ovaj link
    //subResource - je incident.Contact - znaci to nije onaj glavni resource kojiimamona /incident formi
    //resourceHolder - je ovakva strutkura var filterResource = { Contact: {},    User: {},    Account: {},    Team: {} }; - znaic simulacija /incident resource 
    //ili sami /incident

    //ako je resourceHolder nedefiniran onda znaci da radimo na formi od jendog resoruce npr /incident
    //ako je resourceHolder definiran onda smo na /incidens i ovo je strutkura koja simulira /incident resource
    //sacuvamo originalni ili falsi jedna resoruce npr /incident
    //buduci da originalno u ovaj kontrukturo mzomeo doci samo preko init metode a

    this._linkID = linkID; //"#contactLink"
    this._propertyName = propertyName;
    this._subResource = subResource;
    this._resourceHolder = resourceHolder;
    

    //-------------
    //poziv ove funckeij se odvija kad dodatmo entitet a treba ga dodati i u link
    this.createOrUpdate = function(newSubResource) {
        this._subResource = newSubResource;
        //this._resourceHolder[this._propertyName].ID = this._subResource.ID;
        this._resourceHolder[this._propertyName] = this._subResource;
        this.render();
        return this;
    };
    //-------------
    this._humanName = function() {
        return this._subResource ? this._subResource.Name || this._subResource.Title : '';
    };
    //-------------
    this.render = function() {
        //iscrtava podatke na linku i ako postoje
        if (!this._subResource || !this._subResource.URL || !this._subResource.ID) {
            $(this._linkID).prev('.pl-autocomplete').children('.pl-autocomplete-input').show();
            return false;
        }
        else {
            $(this._linkID).prev('.pl-autocomplete').children('.pl-autocomplete-input').hide();
        }

        //na link sa ID "#contactLink" dodaje url , klasu i tekst na kraju kreira link oblika <a id="contactLink" class="linkedEntity" href="http://localhost:5650/phd/contact/6">Anonymous Contact</a>
        $(this._linkID).attr({ href: this._subResource.URL || '#', 'class': 'linkedEntity' });
        $(this._linkID).text(this._humanName());

        //dodaj remove icon ako ne postoji i dodaj click event 
        this._removeIcon = $(this._linkID).next('.removeLE');
        if (this._removeIcon.length == 0) {
            this._removeIcon = $('<a href="#"/>');
            $(this._linkID).after(this._removeIcon);
            this._removeIcon.addClass('removeLE');

            //sprema u ovu ikonu cijeli ovaj this objetk da bi se moglo docido ovih podatak u click eventu od ive ikone this._removeIcon.click()
            this._removeIcon.data('_LEobj', this);

            //dodaje clicke event na remove ikonu
            this._removeIcon.click(function(event) {
                event.preventDefault();
                event.stopPropagation();
                var linkedEntity = $(this).data('_LEobj');

                linkedEntity._resourceHolder[linkedEntity._propertyName].ID = 0;
                if (linkedEntity.onRemove) {
                    linkedEntity.onRemove.apply(linkedEntity, []);
                }
                $(linkedEntity._linkID).html('');
                linkedEntity._removeIcon.unbind('click');
                linkedEntity._removeIcon.data('_LEobj', null);
                linkedEntity._removeIcon.remove();//must be first removed
                var autocompleteInput = $(linkedEntity._linkID).prev('.pl-autocomplete').children('.pl-autocomplete-input');
                autocompleteInput.show()
                autocompleteInput.val('');
                autocompleteInput.focus();              
                return false;
            });
        }
        return true;
    };

    this.render();
};

//------------------------------------------------------------
/** LinkedEntity */
//------------------------------------------------------------
POLAR.View.LinkedEntity = function(propertyName, resource, resourceHolder) {
    //resource je incident.Contact - znaci to nije onaj glavni resource kojiimamona /incident formi
    //resourceHolder je ovakva strutkura var filterResource = {    Contact: {},    User: {},    Account: {},    Team: {} }; - znaic simulacija /incident resource
    //ako je resourceHolder nedefiniran onda znaci da radimo na formi od jendog resoruce npr /incident
    //ako je resourceHolder definiran onda smnona /incidens i ovo je strutkura koja simulira /incident resource
    //sacuvamo originalni ili falsi jedna resoruce npr /incident
    //buduci da originalno u ovaj kontrukturo mzomeo doci samo preko init metode a
    if (undefined == resourceHolder) {
        this._resourceHolder = window.resource;
    } else {
        this._resourceHolder = resourceHolder;
    }

    //propertyName je npr. "Contact" a to je unutar JSON objekta, tj. resoruce, tj. JS objekta /incidetn.Contact pod objekt 
    //kojega vezemo za ovaj link 
    this._propertyName = propertyName;
    this._resource = YAHOO.lang.isObject(resource) ? resource : {};

    if (resource && resource.ID) {
        this.set();
    }

    return this;
};
//------------------------------------------------------------
//TODO:delete it
/*Initialize object 
* @param id - identificatior of link DOM element 
* @param resourceHolder - when we user autcompletelookup widget on resoruce form then is a whole resource (window.resource).  but on other case this is a empty object. */
//------------------------------------------------------------
POLAR.View.LinkedEntity.init2 = function(linkID, propertyName, resource, subResource) 
{
    var linkedEntity = new POLAR.View.LinkedEntity(propertyName, subResource, resource);
    linkedEntity.render($(linkID));    
};
//------------------------------------------------------------
//TODO:delete it
//map je lista imena podresursa u resursu a vrijednsot su IDovi od linka
//resourceHolder- ako se nalazimo na fitleru odna je simulacija jedinicnog resoruca tj JS objekt sa pranzim Contact, Team isl objektima
//a ako smo na jedinicnom resursu kao npr /incident odna je to glavi resoruce
//resourceHolder je ovakva strutkura var filterResource = {    Contact: {},    User: {},    Account: {},    Team: {} }; - znaic simulacija /incident resource
POLAR.View.LinkedEntity.init = function(map, resourceHolder) {
    if (undefined == resourceHolder) {
        resourceHolder = window.resource;
    }

    //propertyName - to je dvojaka stvar, prvo to je ime varijable ispod koje se krije ID od link DOM elementa (Contact: "#contactLink") 
    //a drugo to je istoimeno ime za pdo objekt u resource npr /incident.Contact.
    for (var propertyName in map) {
        var $el = $(map[propertyName]); //jquery objekt - "#contactLink" 
        var rep = resourceHolder[propertyName];//rep je npr. Contact pod objekt od incident JS objekta na reosurce /incident npr. incident.Contact

        if ($el.length && YAHOO.lang.isObject(rep)) {
            var linkedEntity = new POLAR.View.LinkedEntity(propertyName, rep, resourceHolder);
            linkedEntity.render($el);
        }
    }
};
//------------------------------------------------------------
//element - "#contactLink"
//propertyName - "Contact"
POLAR.View.LinkedEntity.createOrUpdate = function (element, propertyName, resource, remove, resourceHolder) {
    if(undefined == resourceHolder) {
        resourceHolder = window.resource;
    }

    var element = $(element);
    if(element.length) {
        if(element.data('_LEobj')) {
            element.data('_LEobj').set(resource);
            return element.data('_LEobj');
        } else {
            var le = new POLAR.View.LinkedEntity(propertyName, resource, resourceHolder);
            le.render(element, remove);
            return le;
        }
    }

    return {};
};
//------------------------------------------------------------
POLAR.View.LinkedEntity.prototype = {
    _humanName: function () {
        return this._resource ? this._resource.Name || this._resource.Title : '';
    },

    render: function(link, remove) {
        //iscrtava podatke na linku i ako je 
        if(!this._resource || !this._resource.URL || !this._resource.ID) {
            return false;
        }

        //na link sa ID "#contactLink" dodaje url , klasu i tekst na kraju kreira link oblika <a id="contactLink" class="linkedEntity" href="http://localhost:5650/phd/contact/6">Anonymous Contact</a>
        this.$link = $(link || this.$link).attr({href: this._resource.URL || '#','class': 'linkedEntity'}).text(this._humanName()).data('_LEobj', this);

        if (remove != false) {
            //dinamicki dodaje link i ikonu preko koje se moze brisati ovaj link:  <a class="removeLE" href="#">[X]</a>
            this.$remove = remove ? $(remove) : (this.$remove ? this.$remove : undefined);
            if(!this.$remove || !this.$remove.length) {
                this.$remove = this.$link.prev('.removeLE');
                if(!this.$remove.length) {
                    this.$remove = $('<a href="#"/>');
                    this.$link.before(this.$remove);
                }
            }

            this.$remove.text('[X]').addClass('removeLE').data('_LEobj', this);

            //dodaje clicke event na remove ikonu
            this.$remove.click(function (event) {
                event.preventDefault();
                event.stopPropagation();
                $(this).data('_LEobj').remove();
                $("#it1").show();
                return false;
            });
            $("#it1").hide();            
        }

        return true;
    },

    set: function (newResource) {
        if(newResource) {
            this._resource = newResource;
        }

        this._resourceHolder[this._propertyName] = this._resource;

        if(this.onSave) {
            this.onSave.apply(this, []); //izgelda da se ne koristi nigdje ovaj onSave
        }

        if(newResource && newResource.ID) {
            this.render();
        }

        return true;
    },

    remove: function () {
        var prop = this._resourceHolder[this._propertyName];
        if(YAHOO.lang.isArray(prop)) {
            var n = prop.length;
            while(n--) {
                if(prop[n].ID == this._resource.ID || prop[n].URL == this._resource.URL) {
                    this._resourceHolder[this._propertyName][n] = {ID: 0};
                }
            }
        } else {
            this._resourceHolder[this._propertyName] = {ID: 0};
        }

        if(this.onRemove) {
            this.onRemove.apply(this, []);
        }

        with(this) {
            $link = $link.data('_LEobj', null).html('') == false;
            $remove = $remove.data('_LEobj', null).unbind('click').remove() == false;
        }

        return true;
    }
};
//---------------------------------------------------------------------------
/* on resource saved
    add methods you want to be called once resource is succesfully saved. this can be used to reset form fields or clear form elements
*/

POLAR.View.Events = function () {

};

POLAR.View.Events._onResourceSavedEvents = new Array();

POLAR.View.Events.addOnResourceSavedEvent = function (delegate) {
    POLAR.View.Events._onResourceSavedEvents.push(delegate);
};

POLAR.View.Events.triggerOnResourceSavedEvents = function () {
    for (var n = 0; n < POLAR.View.Events._onResourceSavedEvents.length; n++) {
        POLAR.View.Events._onResourceSavedEvents[n]();
    }
};

/* attachments
    constructs upload attachments strip. strip consists of upload fields and delete button for each field.
*/
POLAR.View.AttachmentStrip = function (attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI, resetOnSave) {
    $.each(attachments, function(i, n) {
        POLAR.View.AttachmentStrip.addUploadField(n, i, attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI);
    });

    POLAR.View.AttachmentStrip.addNewUploadField(attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI);

    if(false != resetOnSave) {
        // once resource has been saved, all upload fields must to be reset
        POLAR.View.Events.addOnResourceSavedEvent(function () {
            while(uploadFormElement.hasChildNodes()) {
                uploadFormElement.removeChild(uploadFormElement.lastChild);
            }

			//attachments.clear();
            POLAR.View.AttachmentStrip.addNewUploadField(attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI);
        });
    }
};

POLAR.View.AttachmentStrip.addNewUploadField = function(attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI) {
    var index = attachments.length;

    var rootEle = document.createElement('div');

    var formEle = document.createElement('form');
    formEle.setAttribute('id', 'uploadFormAtt' + index);
    formEle.setAttribute('action', 'action');
    formEle.setAttribute('enctype', 'multipart/form-data');
    formEle.setAttribute('method', 'post');

    var fileEle = document.createElement('input');
    fileEle.setAttribute('type', 'file');
    fileEle.setAttribute('name', 'uploadFileAtt' + index);

    var uploadEle = document.createElement('input');
    uploadEle.setAttribute('type', 'button');
    uploadEle.setAttribute('id', 'uploadButtonAtt' + index);
    uploadEle.setAttribute('value', uploadButonText);

    var deleteEle = document.createElement('input');
    deleteEle.setAttribute('type', 'button');
    deleteEle.setAttribute('style', 'visibility: hidden');
    deleteEle.setAttribute('id', 'deleteButtonAtt' + index);
    deleteEle.setAttribute('value', deleteButonText);

    formEle.appendChild(fileEle);
    formEle.appendChild(uploadEle);
    formEle.appendChild(deleteEle);
    rootEle.appendChild(formEle);
    uploadFormElement.appendChild(rootEle);

    var uploaded = false;
    YAHOO.util.Event.on('uploadButtonAtt' + index, 'click', function() {
        if ($("input[name=uploadFileAtt" + index + "]")[0].value != "") {
            //$('#uploadFailed')[0].style['visibility'] = 'hidden';
            $('#uploadFailed').hide();            
            POLAR.View.asyncUpload('uploadFormAtt' + index, attachmentURI, function(response) {
                var jsonResRep = POLAR.View.convertAsyncResponseToObject(response);
                attachments[index] = jsonResRep;

                uploaded = true;
                var deleteButtonElement = YAHOO.util.Dom.get('deleteButtonAtt' + index);
                YAHOO.util.Event.on(deleteButtonElement, 'click', function() {
                    if (uploaded == true) {
                        uploadFormElement.removeChild(rootEle);
                        attachments.splice(index, 1);
                    }
                });

                deleteButtonElement.style['visibility'] = 'visible';

                var uploadButtonElement = YAHOO.util.Dom.get('uploadButtonAtt' + index);
                uploadButtonElement.style['visibility'] = 'hidden';

                POLAR.View.AttachmentStrip.addNewUploadField(attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI);
            });
        }
        else {
            //$('#uploadFailed')[0].style['visibility'] = 'visible';
            $('#uploadFailed')[0].show();
            
        }
    });
};

POLAR.View.AttachmentStrip.addUploadField = function(attachment, index, attachments, uploadButonText, deleteButonText, uploadFormElement, attachmentURI) {
    var rootEle = document.createElement('div');

    var formEle = document.createElement('form');
    formEle.setAttribute('id', 'uploadFormAtt' + index);
    formEle.setAttribute('action', 'action');
    formEle.setAttribute('enctype', 'multipart/form-data');
    formEle.setAttribute('method', 'post');

//    var fileEle = document.createElement('input');
//    fileEle.setAttribute('type', 'file');
//    fileEle.setAttribute('name', 'uploadFileAtt' + index);
//    fileEle.setAttribute('value', 'file');

//    var uploadEle = document.createElement('input');
//    uploadEle.setAttribute('type', 'button');
//    uploadEle.setAttribute('id', 'uploadButtonAtt' + index);
//    uploadEle.setAttribute('value', uploadButonText);

    var deleteEle = document.createElement('input');
    deleteEle.setAttribute('type', 'button');
    deleteEle.setAttribute('style', 'visibility: hidden');
    deleteEle.setAttribute('id', 'deleteButtonAtt' + index);
    deleteEle.setAttribute('value', deleteButonText);

    var filenameEle = document.createElement('span');
    filenameEle.innerHTML = ' ( <a href="' + BASE_URL + 'api/attachment/' + attachment.GUID + '">' + attachment.Name + '</a> ) ';

//    formEle.appendChild(fileEle);
//    formEle.appendChild(uploadEle);
    formEle.appendChild(deleteEle);
    formEle.appendChild(filenameEle);
    rootEle.appendChild(formEle);
    uploadFormElement.appendChild(rootEle);

    var deleteButtonElement = YAHOO.util.Dom.get('deleteButtonAtt' + index);
    YAHOO.util.Event.on(deleteButtonElement, 'click', function() {
        uploadFormElement.removeChild(rootEle);
        attachments.splice(index, 1);
    });

    deleteButtonElement.style['visibility'] = 'visible';

//    var uploadButtonElement = YAHOO.util.Dom.get('uploadButtonAtt' + index);
//    uploadButtonElement.style['visibility'] = 'hidden';
};

POLAR.View.getUri = function()
{
	return resource["URI"];
}

POLAR.View.TopWorkingStart = function() 
{
    $("#messagebox").show();
    $("#messagebox").text(" Processing the request, please wait... ");
}

POLAR.View.TopWorkingEnd = function() {
    /*$("#messagebox2 .topworking").fadeOut(500,
        function() {
            $("#messagebox2 .topworking").remove();
        }
    );*/
}
/*
YAHOO.namespace("WorkingBox");
// Initialize the temporary Panel to display while waiting for external content to load
YAHOO.WorkingBox.wait = new YAHOO.widget.Panel(
            "wait",
			{ width: "240px",
			    fixedcenter: true,
			    close: false,
			    draggable: false,
			    zindex: 4,
			    modal: true,
			    visible: false
			}
		);

YAHOO.WorkingBox.wait.setHeader("Working, please wait...");
YAHOO.WorkingBox.wait.setBody('<img src="http://l.yimg.com/a/i/us/per/gr/gp/rel_interstitial_loading.gif" />');
YAHOO.WorkingBox.wait.render(document.body);
*/

POLAR.View.onCreateData = function() {    
    var button = new YAHOO.widget.Button("buttonCreate");
	button.set("disabled", true); 
	
    POLAR.View.TopWorkingStart();

    //$("#messagebox").hide("fast");
    var transaction = YAHOO.util.Connect.asyncRequest('POST', POLAR.View.getUri(), POLAR.View.requestCallback, POLAR.View.serializeData());
    
    setTimeout(function() {
		button.set("disabled", false); 
    }, 2000);
};
POLAR.View.onCreateAndRedirectData = function() 
{   
	var button = new YAHOO.widget.Button("buttonCreateAndOpen");
	button.set("disabled", true); 
	
    // Show the Panel
    //YAHOO.WorkingBox.wait.show();
    POLAR.View.TopWorkingStart();

    //$("#messagebox").hide("fast");
    var transaction = YAHOO.util.Connect.asyncRequest('POST', POLAR.View.getUri(), POLAR.View.requestCallbackAndRedirect, POLAR.View.serializeData());
    
    setTimeout(function() {
		button.set("disabled", false); 
    }, 2000);
};
POLAR.View.onSaveData = function() {
	var button = new YAHOO.widget.Button("buttonSave");
	button.set("disabled", true); 
	
    // Show the Panel
    //YAHOO.WorkingBox.wait.show();
    POLAR.View.TopWorkingStart();

    //$("#messagebox").hide("fast");
    // Redirect to undeleted resource if deleted
    POLAR.View.Events.addOnResourceSavedEvent(function() {
        var myIndex = window.location.pathname.indexOf('/deleted');
        if (myIndex >= 0) {
            window.location = window.location.pathname.substring(0, myIndex);
        }
    });
    var transaction = YAHOO.util.Connect.asyncRequest('PUT', POLAR.View.getUri(), POLAR.View.requestCallback, POLAR.View.serializeData());
    
    setTimeout(function() {
		button.set("disabled", false); 
    }, 2000);
};
POLAR.View.onDeleteData = function() {
	var button = new YAHOO.widget.Button("buttonDelete");
	button.set("disabled", true); 
	
    // Show the Panel
    //YAHOO.WorkingBox.wait.show();
    POLAR.View.TopWorkingStart();

    //$("#messagebox").hide("fast");

    // Redirect to deleted resource
    POLAR.View.Events.addOnResourceSavedEvent(function() {
        window.location = window.location.pathname + '/deleted';
    });
    var transaction = YAHOO.util.Connect.asyncRequest('DELETE', POLAR.View.getUri(), POLAR.View.requestCallback, POLAR.View.serializeData());
    
    setTimeout(function() {
		button.set("disabled", false); 
    }, 2000);
};
POLAR.View.onUnDeleteData = function() 
{
    // Show the Panel
    //YAHOO.WorkingBox.wait.show();
    POLAR.View.TopWorkingStart();

    //$("#messagebox").hide("fast");
    // Redirect to undeleted resource
    POLAR.View.Events.addOnResourceSavedEvent(function() {
        var myIndex = window.location.pathname.indexOf('/deleted');
        if (myIndex >= 0) {
            window.location = window.location.pathname.substring(0, myIndex);
        }    
    });
    var transaction = YAHOO.util.Connect.asyncRequest('PUT', POLAR.View.getUri(), POLAR.View.requestCallback, null);
};
    
POLAR.View.args = {};
POLAR.View.requestCallback = {
    success:POLAR.View.asyncResponseFailure,
    failure:POLAR.View.asyncResponseFailure,
    argument:POLAR.View.args
};

POLAR.View.asyncResponseRedirect = function(response) {
    if (response.status == 201) {
        var jsonResRep = YAHOO.lang.JSON.parse(response.responseText);
        window.location = jsonResRep.URL;
    }
    POLAR.View.setAsyncResponseMessage(response);
};

POLAR.View.requestCallbackAndRedirect = {
    success: POLAR.View.asyncResponseRedirect,
    failure: POLAR.View.asyncResponseFailure,
    argument: POLAR.View.args
};

POLAR.View.asyncResponseRedirectExt = function(response) {
    if (response.status == 200) {
        window.location = response.argument.URL;
    }
    else {
        POLAR.View.setAsyncResponseMessage(response);
    }    
};

POLAR.View.requestCallbackAndRedirectExt = {
    success: POLAR.View.asyncResponseRedirectExt,
    failure: POLAR.View.asyncResponseFailure,
    argument: POLAR.View.args
};

POLAR.View.asyncResponseOnPostRedirect = function(response) {
    if (response.status == 201) {
        var jsonResRep = YAHOO.lang.JSON.parse(response.responseText);
        window.location = jsonResRep.URL;
    }    
    else {
        POLAR.View.setAsyncResponseMessage(response);
    }
};

POLAR.View.requestCallbackOnPostRedirect = {
    success: POLAR.View.asyncResponseOnPostRedirect,
    failure: POLAR.View.asyncResponseFailure,
    argument: POLAR.View.args
};


//when invoke AJAX call on other URL then current paga like /userpreference
POLAR.View.requestCallbackAJAXSilence = {
    success: function(){},
    failure: function(){},
    argument: POLAR.View.args
};

//Delete unnessery information from JSON - we do not need send this information to server if exist
POLAR.View.clearExtraJSResRepForPUTandDELETE = function(inResRep) {
    var resRep = jQuery.extend(true, {}, inResRep);
    delete resRep.AuthenticatedPerson;
    delete resRep.Labels;
    delete resRep.LabelsCommon;
    //delete resRep.UserPreference;
    //delete resRep.UserResourcePermissions;
    delete resRep.Errors;
    delete resRep.Messages;    
    return resRep;
};

POLAR.View.AssigneEventHandler1 = function ()
{
    if ( $('#buttonCreate').length )
    {
        var oCreateButton = new YAHOO.widget.Button("buttonCreate");
        oCreateButton.on("click", POLAR.View.onCreateData);
    }
    if ($('#buttonCreateAndOpen').length) 
    {
        var oCreateAndRedirectButton = new YAHOO.widget.Button("buttonCreateAndOpen");
        oCreateAndRedirectButton.on("click", POLAR.View.onCreateAndRedirectData);
    }
    if ( $('#buttonSave').length )
    {
        var oSaveButton = new YAHOO.widget.Button("buttonSave");
        oSaveButton.on("click", POLAR.View.onSaveData);
    }
    if ( $('#buttonDelete').length )
    {
        var oDeleteButton = new YAHOO.widget.Button("buttonDelete");
        oDeleteButton.on("click", POLAR.View.onDeleteData);
    }
    if ($('#buttonUnDelete').length) {
        var oUnDeleteButton = new YAHOO.widget.Button("buttonUnDelete");
        oUnDeleteButton.on("click", POLAR.View.onUnDeleteData);
    }    
    if ($('#buttonExport').length) {
        var oExportButton = new YAHOO.widget.Button("buttonExport");
        oExportButton.on("click", POLAR.View.Export);
    }
};

POLAR.View.Export = function() {
    var url = document.location;
    if (/\?/) {
        url += "&fileformat=csv";
    }
    else {
        url += "?fileformat=csv";
    }

    window.location = url;
}

POLAR.View.AssigneEventHandler1();

// equalize width of all dropdown lists but do not reduce in size lists which have more text to show than what can fit in the predetermined maximum weidth of the list
$("select").each(function(key, val) {
	if(parseInt($(val).css("width")) < 200) {
		$(val).css("width", "200px");
	}
});

/* outdated but still in use */

if (!this.POLAR1) {
    POLAR1 = function () {
		//-------------------------------------------------------
		function getUri() {
			return resource["URI"];
		}
		//-------------------------------------------------------
		/*function onSaveData() {
			var transaction = YAHOO.util.Connect.asyncRequest('PUT', getUri(), callbackSave, POLAR.View.serializeData());
		}*/
		//-------------------------------------------------------
		/*function onCreateData() {
			var transaction = YAHOO.util.Connect.asyncRequest('POST', getUri(), callbackCD, POLAR.View.serializeData());
		}*/
		//-------------------------------------------------------
		/*
		function onDeleteData() {
			var transaction = YAHOO.util.Connect.asyncRequest('DELETE', getUri(), callbackDelete, POLAR.View.serializeData());
		}
		*/
		//-------------------------------------------------------
		function onTest1() {
			var transaction = YAHOO.util.Connect.asyncRequest('GET', getUri(), callbackTest1);
		}

		//-------------------------------------------------------
		// Passing an example of array of arguments to both  the success and failure callback handlers.
		var args = ['foo','bar'];
		//-------------------------------------------------------
		var callbackTest1= {
		  success:POLAR.View.asyncResponseFailure,
		  failure:POLAR.View.asyncResponseFailure,
		  argument:args
		};
		//-------------------------------------------------------
		var callbackCD = {
		  success:POLAR.View.asyncResponseFailure,
		  failure:POLAR.View.asyncResponseFailure,
		  argument:args
		};
		//-------------------------------------------------------
		var callbackDelete = {
		  success:POLAR.View.asyncResponseFailure,
		  failure:POLAR.View.asyncResponseFailure,
		  argument:args
		};
		//-------------------------------------------------------
		AssigneEventHandler1();
		function AssigneEventHandler1() {
			/*var btnSave = document.getElementById("buttonSave");
			if(btnSave != null ){
				btnSave.onclick = onSaveData;
			}*/
			/*var btnDelete = document.getElementById("buttonDelete");
			if(btnDelete != null ){
				btnDelete.onclick = onDeleteData;
			}*/
			/*var btnCreate = document.getElementById("buttonCreate");
			if(btnCreate != null ){
				btnCreate.onclick = onCreateData;
			}*/
			var btnTest1 = document.getElementById("buttonTest1");
			if(btnTest1 != null ){
				btnTest1.onclick = onTest1;
			}
		}
    }();
}

// Array Remove - By John Resig (MIT Licensed) - http://ejohn.org/blog/javascript-array-remove/
/*
and here's some examples of how it could be used:
// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);
*/
/*Array.prototype.remove = function(from, to) {
    var rest = this.slice((to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);    
};*/

/*Example of use:
var selectedArray = [];
selectedArray[0] = 23;
POLAR.Util.ArrayRemove(selectedArray, 0);
*/
POLAR.Util.ArrayRemove = function(array, from, to) {
    var rest = array.slice((to || from) + 1 || array.length);
    array.length = from < 0 ? array.length + from : from;
    return array.push.apply(array, rest);
};


//http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/
/*Array.prototype.unique = function() {
    var o = {}, i, l = this.length, r = [];
    for (i = 0; i < l; i++) o[this[i]] = this[i];
    for (i in o) r.push(o[i]);
    return r;
};*/
/*POLAR.Util.arrayUnique = function(array) {
    var o = {}, i, l = array.length, r = [];
    for (i = 0; i < l; i++) o[array[i]] = array[i];
    for (i in o) r.push(o[i]);
    return r;
}*/

//http://www.eggheadcafe.com/community/aspnet/3/10007600/javascript-array-and-dupl.aspx
//TODO:SP: treba koristiti dvije petelje kao na http://www.shamasis.net/2009/09/fast-algorithm-to-find-unique-items-in-javascript-array/
//terbamo micati prema jednakosti jednog propertija od arra i to od kara iliod pocetka.. treba jos odluciti.
//Ova sadasnja implementacija mice samo susjedne duplikate.
POLAR.Util.arrayUnique = function(arr, property) {
    //get sorted array as input and returns the same array without duplicates.
    var result = new Array();
    var lastValue = "";
    //var prop = property.toString();
    for (var i = 0; i < arr.length; i++) {
        var curValue = arr[i];
        if (curValue != null) {
            var obj = arr[i];
            var curValueProperty = arr[i][property];
            if (curValueProperty != lastValue) {
                result[result.length] = curValue;
            }
            lastValue = curValueProperty;
        }
    }
    return result;
}