CodeCharge Studio
search Register Login  

Visual PHP Web Development

Visually Create Internationalized Web Applications, Web Reports, Calendars, and more.
CodeCharge.com

YesSoftware Forums -> CodeCharge Studio -> Wishes

 AJAX support

Print topic Send  topic

Author Message
marcwolf


Posts: 361
Posted: 10/13/2005, 4:27 PM

Having been using a home brew form of AJAX for over a year now (I used IFrames as the transport mechanism rather than HTTPRequest) I will be interested to see if CCS will have additional support for this.

Certainly things like look-ups and dependant listboxes will benefit greatly with this technology.

Just an idea

Dave
_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
mybeshoo
Posted: 10/16/2005, 5:03 PM

it wil be wonderfull to have it in CCS
roeya


Posts: 181
Posted: 11/01/2005, 1:00 PM

You can easily integrate http://prototype.conio.net/ and http://script.aculo.us/ with your current code.

Quote marcwolf:
Having been using a home brew form of AJAX for over a year now (I used IFrames as the transport mechanism rather than HTTPRequest) I will be interested to see if CCS will have additional support for this.

Certainly things like look-ups and dependant listboxes will benefit greatly with this technology.

Just an idea

Dave

_________________
http://www.infoneto.com/
View profile  Send private message
Faysal M
Posted: 11/23/2005, 10:36 AM

Yes YEs ...

Ajax SUPPORT!! YES YES >.....

.AjaxCombobox
Ajax Grid Control.
Ajax Lists
Ajax as much as possible (Drag and Drop would be AWESOME)

Yusuf Akyol
Posted: 11/30/2005, 10:38 AM

I think and wish, CodeCharge Studio must support Ajax, immediately. Otherwise will be a little bit old fushion.
Vasiliy

Posts: 378
Posted: 11/30/2005, 4:25 PM

Quote :
I think and wish, CodeCharge Studio must support Ajax, immediately. Otherwise will be a little bit old fushion.

IMO just a wish is not enough.
It would be a good start if somebody share examples of AJAX integration into CCS. This could help us and Yes to get an idea of how to integrate AJAX into CCS.

So, can somebody share experience?
_________________
Vasiliy
View profile  Send private message
John K.
Posted: 12/03/2005, 3:57 AM

Found this... www.backbase.nl

Looks beautifull
Walter Kempees
Posted: 12/03/2005, 4:09 AM

John,
Sure it does look beautifull.
Have you seen the per user/per server licencing fees?
Dutch product, so I'am probably biased ;0

Note though, this is a standalone development environment not intended to be
include in any CCS like environment at least that's as far as I've got.
I would recommend reading on the Google results for sajax and ajax (not
football = Dutch again).
Am presently studying on "Ruby on Rails" which goes further still.

For this topic though, I am looking at a AJAX technique we use already in
our non CCS developments.
Am trying to figure out a way to steer that from within CCS.
Mainly lookups and stuff.

Walter



<JohnK.@forum.codecharge (John K.)> schreef in bericht
news:224391881bd61f4@news.codecharge.com...
> Found this... www.backbase.nl
>
> Looks beautifull
> ---------------------------------------
> Sent from YesSoftware forum
> http://forums.codecharge.com/
>

Vasiliy

Posts: 378
Posted: 12/03/2005, 7:36 PM

Quote John K.:
Found this... www.backbase.nl
Looks beautifull

Thank you for interesting link. I was playing with their demos for 3 hours ...
First impression - wow. Impressive.
Looked at all controls. It would be good to have in CCS some similar controls, like:
layout: modal, window ... box is good as well
navigation: navpanel, tabbox, tree
info controls: accordeon, infobox/tooltip
data controls: treelist (similar to nav tree)
Also, nice Drag&Resize and Effects, but applicable to backbase controls only.

After testing I have some cons/questions:
1. Slow
2. CPU eater
3. For IE with www.backbase.com/demos after some usage Task Manager shows 82mb ram / 74mb VM usage. Not good.
4. some bugs, like in linechart
5. Multi-lang support is questionable.
6. weak sorting (by list column only and on a client side, not applicable for DBMS)
7. specific JS-like programming language

Bottom line:
backbase is a _perfect_ example of ajax usage, but for rapid development of web-DBMS I'd stick with CCS3 ... 100%. :-D

Quote Walter:
Am presently studying on "Ruby on Rails" which goes further still.

Walter, can you share your opinion, why have you decided to study Ruby, what is so impressive? My collegue is studying Ruby as well, but I don't get the benefits.
Sorry to all for offtopic, I can not PM this question. Maybe somebody else will be interested as well.
_________________
Vasiliy
View profile  Send private message
Vasiliy

Posts: 378
Posted: 12/03/2005, 7:39 PM

Quote Walter:
Note though, this is a standalone development environment not intended to be include in any CCS like environment at least that's as far as I've got.

You are right, I also don't see how this solution can be integrated with CCS.
_________________
Vasiliy
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/03/2005, 7:58 PM

Hi Folks.

Having been following this post for a while I am wondering if folks really know what AJAX or JSON is and how it might help them in programming.

Now I hope I don;t ruffle feather with this post But.

AJAX is not the panacea for all programming problems. A lot of what we do in CCS can easily be implemented with a bit of brainwork and some clever programming without resorting to a full AJAX implementation.

JSON is a kind of subset of AJAX except it is more on returning javascript that can be run on the client than a block of XML (which is AJAX)

For example

AJAX list boxes are just dependant listboxes that have a back-end connection to the server.

The same with AJAX Grids.

Now CCS in their example pack 2 have done a very functional example of this with their dependant listboxes. And the same can be implemented with a grid ONCE you know the row ID. And thats east because the ROW ID is at the end of each gripd control ( _1, _2, _3)

Armed with that then all controls on the grid are accessable from Javascript, and likewise any AJAX style script.

AJAX uses XML and hence the httpXMLReguest. The same can be done using frames and just chanign the Location if the IFrame and then using standard Javascript interframe communicatin to do the work.

As for quickly changing text in area's of a page - just create a div, give it an ID, and then change it's innerhtml to display the new text.

I'm just hoping that folks are not putting all of their hopes on something that may not offer all of the advantages they need.

Just my viewpoint.

Dave

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
Walter Kempees
Posted: 12/04/2005, 7:45 AM

To ALL
Studying "Ruby on Rails" because:
1) everybody is talking AJAX, I googled AJAX and drifted away (as always).
Ruby (the language) grasped my interest just because.
The Rails being a Framework intepreted as a wrapper around a language in
this case Ruby.
Also the simple command structure OOPS based just got my interest, just take
a look at their 15minute video and you're hooked.
For those who don't know me, I am probably the laziest one around, have been
studying and using and moving away almost every codegenerator (nowadays RAD
tools) available since 1984. I've seen them come, I've seen them grow, I've
seen them destroy themselves.
My team and I have used several with sometimes extreem success (CodeGen
(Cobol)->Memphis -lotofothers-> Clarion --> CCS), always instignated by
discovering, experimenting and deploying if we saw the slightest possibility
of accomplishing what we needed in even shorter time.

To Jonh K and Vasilly on Backbase
Backbase was already known to us, they just did a major deal with maybe n#1
developer in the Netherlands, which we watch closely for the beautiful
products they do and their CEO being one of our former colleagues.
Backbase is an environment on it's own, as I stated earlier not interesting
in a CCS context other then probably teasing us with what WEB2
functionalities we would want integrated in CCS.
But CCS will suffice for a long time to come and we surely don't want it to
die because of overextending! (my personal opinion)

That said:
to marcwolf, Dave
I think you are right to re-point this topic to the original wish of
integrating AJAX within CCS.
I didn't find JSON, but will soon.

If only one would share a technique (Paper in tips-and -solutions for
instance) and/or probably a library (js) to accomplish async lookup, we
would have a happy community.

To all again:
It is as ever the problem of finding the solution to integrate with CCS in
such a way that the ease of reaching goals remains.
Trust that we are looking into this sort of integration but then again we
also have our jobs to do.
Let's keep this topic a live by trying to formulate needs and requirement
and eventually definig a solution for all.
Now if that is not a wish........

Besides: It's not the techniques that we use but the usebility that sells
applications.

Walter
(Sunday's reflections)








"marcwolf" <marcwolf@forum.codecharge> schreef in bericht
news:22439269638e2a0@news.codecharge.com...
> Hi Folks.
>
> Having been following this post for a while I am wondering if folks really
> know
> what AJAX or JSON is and how it might help them in programming.
>
> Now I hope I don;t ruffle feather with this post But.
>
> AJAX is not the panacea for all programming problems. A lot of what we do
> in
> CCS can easily be implemented with a bit of brainwork and some clever
> programming without resorting to a full AJAX implementation.
>
> JSON is a kind of subset of AJAX except it is more on returning javascript
> that
> can be run on the client than a block of XML (which is AJAX)
>
> For example
>
> AJAX list boxes are just dependant listboxes that have a back-end
> connection to
> the server.
>
> The same with AJAX Grids.
>
> Now CCS in their example pack 2 have done a very functional example of
> this
> with their dependant listboxes. And the same can be implemented with a
> grid
> ONCE you know the row ID. And thats east because the ROW ID is at the end
> of
> each gripd control ( _1, _2, _3)
>
> Armed with that then all controls on the grid are accessable from
> Javascript,
> and likewise any AJAX style script.
>
> AJAX uses XML and hence the httpXMLReguest. The same can be done using
> frames
> and just chanign the Location if the IFrame and then using standard
> Javascript
> interframe communicatin to do the work.
>
> As for quickly changing text in area's of a page - just create a div, give
> it
> an ID, and then change it's innerhtml to display the new text.
>
> I'm just hoping that folks are not putting all of their hopes on something
> that
> may not offer all of the advantages they need.
>
> Just my viewpoint.
>
> Dave
>
> _________________
> ' Coding Coding Coding
> Keep Those Keyboards Coding.
> Raw Code!!!!!!!
> ---------------------------------------
> Sent from YesSoftware forum
> http://forums.codecharge.com/
>

marcwolf


Posts: 361
Posted: 12/04/2005, 4:57 PM

Hi Folks

I have some simple AJAX with an IFrame fall back but I'm not sure if I can attach them to this formum.

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 5:01 PM

Sorry It the Submit instead of Preview.

So what I am going to do is post 3 posts.

The First is caller.htm and this calls one of 2 ASP pages.

The Second is return.asp and this act upon and update several text fields on caller.html

The Third is FillDiv.asp and this will fill a DIV in caller.htm

Hope you enjoy.. Sorry about doing it this way as I cannot save attachments

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 5:02 PM

caller.htm

  
  
  
<html>  
  
  
<script language="javascript">  
  
// Makes XML Instance  
function AjaxInstance(){  
  var A=null;  
  try{A=new ActiveXObject("Msxml2.XMLHTTP")  
  }catch(e){ try{ A=new ActiveXObject("Microsoft.XMLHTTP")  
    } catch(oc){ A=null  // No XML Available  
	 }  }  
  if(!A && typeof XMLHttpRequest != "undefined") { A=new XMLHttpRequest() }  
  return A  
}  
  
// Calls AJAX with Backup to IFrame  
function AjaxCall(Url, iForceIFrame){  
var instXML = AjaxInstance()  
 if (iForceIFrame==1) { instXML=null;} // Forces IFrame for Testing  
 if (instXML){  Url = Url + '&XML=1'; // Mark this as an XML call  
  instXML.open("GET", Url,true); instXML.onreadystatechange=function() {  
  if (instXML.readyState==4) {   try {eval(instXML.responseText);}catch(e){alert('AJaxXML Failed');alert(instXML.responseText);}  }  
 }  
 instXML.send(null);  
 }  else   
 {   
	//Create a Frame and Work with that if XML does not exist   
	 Url = Url + '&XML=0' // Mark this as an IFRAME call  
	 var s=document.createElement("DIV");  s.style.visibility="hidden";  s.style.position="absolute";  s.style.left="-10000";  
	  s.style.top="-10000";  s.style.width="0";  s.style.height="0";  
	  var M=document.createElement("IFRAME");  M.name="AjaxFrame";  M.id="AjaxFrame";  
	  s.appendChild(M);	  document.body.appendChild(s);  
	 frames['AjaxFrame'].location.href=Url;  
 }  
  
}  
  
// If XML does not exist then this will handle the JS Return  
function AjaxFrameReturn()  
{  
// If XMLHTTPRequest Fail then this handles the callback  
var innerp1 = frames['AjaxFrame'].document.getElementById('AjaxJSCode')  
var innerp2 = innerp1.innerHTML  
try {eval(innerp2);}catch(e){alert('AJaxFrame Error');alert(innerp2);}  
}   
  
  
function clear(){  
document.getElementById('qty').value = '';  
document.getElementById('price').value = '';  
document.getElementById('color').value = '';  
document.getElementById('data1').innerHTML = 'This is a DIV - see it change..<br>';  
}  
  
</script>  
  
  
  
<META content="MSHTML 6.00.2800.1515" name=GENERATOR></HEAD>  
<BODY>  
  
This will test the XML and IFrame Return Mechanism<br>  
  
<a href="javascript:clear();"> Clear </a><br>  
<a href="javascript:AjaxCall('./return.asp?a=1',1);"> IFRAME Test </a><br>  
<a href="javascript:AjaxCall('./return.asp?a=1');"> XML Test </a><br>  
<a href="javascript:AjaxCall('./FillDiv.asp?a=1',1);"> Fill Div Test </a><br><br><br>  
  
Quantity :- <input ID="qty" type="text"><br>  
Pricing :-  <input ID="price" type="text"><br>  
Color :-    <input ID="color" type="text"><br><br>  
  
  
<div border=1 id="data1">  
This is a DIV - see it change..<br>  
</div>	  
  
</BODY></HTML>  
  
  
  
  
  
  

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 5:03 PM

return.asp

  
  
<%  
' needed to STOP caching of returned page  
Response.Expires = 60  
Response.Expiresabsolute = Now() - 1  
Response.AddHeader "pragma","no-cache"  
Response.AddHeader "cache-control","private"  
Response.CacheControl = "no-cache"  
  
' is this a call from XML?  
Dim isXML, XMLText  
If request.querystring("XML") = 1 then  
	isXML= true:XMLText = "XML"  
else  
	isXML = False:XMLText = "IFrame"  
End if  
  
' Write Header if NOT XML  
If NOT isXML then Response.Write "<script language='xxx' id=""AjaxJSCode"" >" & vbcrlf  
  
' working code here. This is just a simple function but can be made much more  
  
Response.Write "// used to store generated script" & VbCrLf  
Response.Write "alert('" & XMLText & "');" & VbCrLf  
Response.Write "document.getElementById('qty').value = 50;" & VbCrLf  
Response.Write "document.getElementById('price').value = '$49.95';" & VbCrLf  
Response.Write "document.getElementById('color').value = 'Blue';" & VbCrLf  
  
' Write a footer is not XML   
If NOT isXML then  Response.Write "</script>" & vbcrlf & "<script language=""javascript"">window.parent.AjaxFrameReturn();</script>"&vbcrlf  
%>  
  
  
  

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 5:04 PM

FillDiv.asp

  
  
  
  
<%  
' needed to STOP caching of returned page  
Response.Expires = 60  
Response.Expiresabsolute = Now() - 1  
Response.AddHeader "pragma","no-cache"  
Response.AddHeader "cache-control","private"  
Response.CacheControl = "no-cache"  
  
' is this a call from XML?  
Dim isXML, XMLText  
If request.querystring("XML") = 1 then  
	isXML= true:XMLText = "XML"  
else  
	isXML = False:XMLText = "IFrame"  
End if  
  
' Write a Header if NOT XML  
If NOT isXML then Response.Write "<script language='xxx' id=""AjaxJSCode"" >" & vbcrlf  
  
' working code here. This is just a simple function but can be made much more  
' This will FILL a DIV on the calling page  
  
Response.Write "// used to store generated script" & VbCrLf  
Response.Write "var p1 = frames['AjaxFrame'].document.getElementById('tmp1'); "  
Response.Write "document.getElementById('data1').innerHTML = p1.innerHTML;"  
  
  
' Wite a footer if NOT XML  
If NOT isXML then  Response.Write "</script>" & vbcrlf   
  
' DIV code for transfer. One can fill this with anything with Code, or just get HTML from a database  
%>  
<div id='tmp1'>  
<b> This is a test of the Div</b>   
</div>  
<%  
  
' Do a return Call back to Calling page.  
If NOT isXML then  Response.Write "<script language=""javascript"">window.parent.AjaxFrameReturn();</script>"&vbcrlf  
%>  
  
  
  

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 5:30 PM

Ok Folks..

How does it work.
Essentially what I am trying to do is to get Javascript to be run on the calling page so we do not have to worry about interframe communication.

Now - there are 3 routines that we work with

AjaxInstance creates an Instance of the HttpXMLrequest. It the Browser cannot support this then it returns a NULL

AjaxCall does the actual work. It is passed 2 parameters (the second being optional)
The first parameter is the ASP page that we want to do the work. The second will for the IFrame solution for testing or when IFrame is more efficent.

When AjaxCall is called it first checks to see if there is an valid AjaxInstance. If there it then it attaches '?XML=1' to the URL so that the ASp knows what to do with the data.
If there is not an AjaxInstance we create a IFrame on the fly so that communications between the two pages can occur. It also attaches '?XML=0' to the URL

Now - when working with HttpXMLRequest a block of Javascript code is passed back and this is run using the EVAL JS function. If this failes then a warning is popped up.

If XML is not available then the called page uses a function on the calling page AjaxFrameReturn to pick up the information from the called page and rund it.
To get around the problem of the browser reformatting the JS code in the IFrame I create a dummy script block and just use it's INNERHTML to get the Javascript code
i.e. if I was to display I < 0 then the browser will format this as I < 0 and ofcourse this will fail. So the Script Block protects our code.

Now - what happens in the called page.

We check that we are returning via XML or IFrame.
If it is via an XML then we just create the Javascript and it is returned without any modification and is run on the calling page.

If there is NO XML then we will need to add some wrappers so that the Javascript is protected form Browser influence, (Script Block), ensure that it cannot be run on this page (dummy langauge in script block)
And that this page then calls the function AjaxFrameReturn on the called page.


So there we have the basics of Ajax with a fallback. Essentially all we are doing is creating Javascript on the fly and returning it to the calling page to be run.

The FillDiv example simple populates a DIV on the calling page with text from the called page. You can use this for say.. quick displays (Press this button and quickly see the customer details when looking at an order form)

Really folks - the sky is the limit with what you can do with this.

Hope this helps someone

Dave



_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
Vasiliy

Posts: 378
Posted: 12/04/2005, 8:41 PM

Thanks Dave.
Do you know, will this example work on Firefox and Opera?
_________________
Vasiliy
View profile  Send private message
marcwolf


Posts: 361
Posted: 12/04/2005, 8:47 PM

Firefox - No Probs - I have tested it with the lates download.

Opera.. Sorry - no access to MAC's.. If someone can tesat then fine

I don't think there will be any problems with Opera, even if it does not have AJAX support then the IFRAME fallback is tried and proven

Take Care

Dave

_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
Edd


Posts: 547
Posted: 12/05/2005, 5:22 AM

Dear ALL

For those who don't know power of Ajax, be prepared to give up 10 minutes of your day to change your perspective.

see

http://www.jackbe.com/prod_demo_done.html

VERY, VERY, VERY IMPRESSIVE!!!

No word on pricing yet but wow!!!

Edd
_________________
Accepting and instigating change are life's challenges.

http://www.syntech.com.au
View profile  Send private message
mamboBROWN


Posts: 1713
Posted: 12/05/2005, 8:50 AM

Edd,
It is very impressive. I am currently looking into ways to incorporate some AJAX capabilities into my web applications. Thanks for the link.
View profile  Send private message
Benjamin Krajmalnik
Posted: 12/12/2005, 11:17 PM

JackBE (as well as most of the other Ajax development platforms) has a licensing model which wil probably put it out of reach for most CCS users, since they are priced on a per server deployed model, and their pricing is usually higher than what we sell our applications for.

Now, let's look at CCS and Ajax. They have different paradigms. I can see where Ajax-type approaches would come in handy (I currently use something similar using a pop-up box in the background) for repopulating dependent listboxes, looking up values based on control changes, etc. That being said, it does not replace the CCS architecture - specially if you are running a target language which supports templates.

In short, I like having the best of both worlds.
IF you have further interest in Ajax, you may want to also take a look at www.openrico.org

marcwolf, thanks for your example of your Ajax implementation. I am going to test in this week by modifying some of my code to use it, since either the true Ajax or the IFrame will, in my opinion, be nicer than the current method I have of popping up an unsightly window (if only for a split second), and the potential issues with popup blockers.
xbill

Posts: 35
Posted: 12/13/2005, 3:08 PM

It looks like openrico should also be fairly easy to add to existing CCS projects.

At least for these snippet libraries- there is no licensing or further
redistribution issues as they are Open Source / BSD style licenses...

-bill
View profile  Send private message
beshoo3
Posted: 03/24/2006, 3:50 PM

Please can you advise a smae script but for php ?
Mike Hoskins
Posted: 03/27/2006, 11:09 AM

AJAX is an absolute necessity, in this day and age.
mikehoskins

Posts: 17
Posted: 03/30/2006, 10:33 AM

...built-in AJAX, that is. This cannot be bolted-on to CCS...
View profile  Send private message
Benjamin Krajmalnik
Posted: 03/30/2006, 6:23 PM

Mike,

Yes and no. The two methodologies (AJAX and what CodeCharge is doing) are
complementary, and not mutually exclusive.
If CodeCharge were to go full AJAX you would lose a large portion of the
feature set their architecture brings out.

Unfortunately, many people get caught by the "Technology DeJour". I
remember in the late '80s everybody "talked" TQM. Then it went to
"Reengineering", etc., etc.

I look at things differently. I have an affordable, reliable framework in
CodeCharge. I augment it by writing my own classes, customizing theirs to
do what I need, or "boltin-in" other technologies when the need arises. The
beauty of the CodeCharge framework is that if ou study the framework and
start thinking "outside the bos", there is really no limit to how you can
extend it.

While my two current commercial projects are in ASP, the new generation of
my projects is PHP. I have not looked "under the hood" of the PHP framework
to the extent I have in the ASP one, but it too me an entire 30 minutes to
seamlessly integrate XAJAX into the codecharge framework. So far, there is
nothing we have been unable to do with CodeCharge using a bit of creativity.

marcwolf


Posts: 361
Posted: 03/30/2006, 6:32 PM

Thanks Benjamin

You have said it very eloquently

CCS is an excellent tool that you - the user - can extend.

Take Care

Dave
_________________
' Coding Coding Coding
Keep Those Keyboards Coding.
Raw Code!!!!!!!
View profile  Send private message
fabio

Posts: 19
Posted: 04/08/2006, 2:33 PM

Yes!!! AJAX now!!!

It would be simply amazing to have AJAX integrated in CodeCharge..This is my wish #1, and I guess many of you also want that!!!!

View profile  Send private message

Add new topic Subscribe to topic   


These are Community Forums for users to exchange information.
If you would like to obtain technical product help please visit http://support.yessoftware.com.

PHP Reports

Visually create Web Reports in PHP, ASP, .NET, Java, Perl and ColdFusion.
CodeCharge.com

Home   |    Search   |    Members   |    Register   |    Login


Powered by UltraApps Forum created with CodeCharge Studio
Copyright © 2003-2004 by UltraApps.com  and YesSoftware, Inc.