two men with computer and tablet

Create a Custom Control to Wrap the Google JSON/ATOM Custom Search API, Part 1

A handy technique that makes it easier to programmatically implement Google's Custom Search

Google's Custom Search allows you to create custom search engines based on Google's solid foundation of searching capabilities. A Google Custom Search Engine is an easy way to provide a search capability for your websites or blogs. Once created, the custom search engine can be consumed by adding a search box on any of the web pages or by linking to the home page of the custom search engine. At times, however, we may need some advanced way to consume our search engine. Say, for example, we want to programmatically perform search operations against our custom search engine or want to retrieve the search results in a Windows application. Fortunately Google has come up with JSON/ATOM Custom Search API, which can be used to accomplish just that. As the name suggests, the custom search API returns search results in JSON or ATOM format, depending upon your choice, and can be invoked using the Representational State Transfer (REST) programming model.

Though the JSON/ATOM Custom Search API is simple to use and primarily rely on GET requests, wrapping this API in a custom control would make it even easier to use. That way, without having to learn the JSON/ATOM Custom Search API, anyone can just drag and drop the custom control, set a few properties, and consume the custom search engine. In this article and the next in a two-part series, we are going to do just that.

Before You Begin

Note that as of this writing the JSON/ATOM Custom Search API is in Google Labs and, as such, is subject to change. Also note that to use this API you need to have the following things:

  • a Google Custom Search Engine. You can create one by visiting www.google.com/cse and following the step-by-step instructions found there. We won't cover those basics in this article.
  • an API key. Calling JSON/ATOM Custom Search API requires an API key. You can obtain one using Google API Console.
  • Every custom search engine is assigned a unique ID. You will need this ID while making REST calls.

Understanding Google's JSON/ATOM Custom Search API

As a control author we should be aware of how Google's JSON/ATOM Custom Search API works. From our code (client side or server side), we will be sending a GET request to the following URL:

https://www.googleapis.com/customsearch/v1?parameters

You can find the complete list of query string parameters in Google's online documentation for the JSON/Atom Custom Search API. We will be using the query string parameters listed in Figure 1 in our custom control.

Query string parameter Description
Figure 1: Query string parameters of Google’s REST based custom search API
key The API key as obtained from Google API console
cx The ID of the custom search engine that you wish to use.
alt Data format for search results. Possible values are json (default) and atom.
callback Name of a JavaScript function that will be called when search results are returned.
lr Language restriction for the search results. By default no restriction is placed.
safe Search safety level. Possible values are high, moderate and off (default). See online documentation for more details.
filter Governs turning on or off the duplicate content filter. Possible values are 0 (off) and 1 (on). Default is 1.
q The search criteria.

A typical client-side call to invoke the above REST service will look like this:

Once the results are retrieved, the client-side callback function (MyHandler in above example) will be called, and the results in JSON/ATOM format are passed to it as a parameter. The complete details of the result format for JSON and ATOM can be found in the online documentation. For our example we need the pieces of data, as listed in Figure 2.

JSON object property ATOM tag name Description
Figure 2: List of JSON object properties and ATOM tags
title </td> <td> The title of the search result item in plain text.</td> </tr><tr><td> htmlTitle</td> <td> <title></td> <td> The title of the search result item in HTML.</td> </tr><tr><td> link</td> <td> <link></td> <td> The full URL to which the search result item is pointing.</td> </tr><tr><td> displayLink</td> <td> <link></td> <td> A short version of search result’s full URL</td> </tr><tr><td> snippet</td> <td> <summary></td> <td> A short snippet from the search result item in plain text.</td> </tr><tr><td> htmlSnippet</td> <td> <summary></td> <td> A short snippet from the search result item in HTML.</td> </tr></tbody></table><p>Now that we know the basics of using the Google JSON/ATOM custom search API, let's focus on wrapping the API in an ASP.NET custom server control.</p> <h3> The Custom Control</h3> <p>We will create an ASP.NET custom server control (Google REST API Control) complete with designer support and a smart tag that allows us to consume the JSON/ATOM Custom Search API. The control will be invisible at runtime. Figures 3 and 4, respectively show the look and feel of the control at design time along with its smart tag.</p> <div class="contentimage" style="width: 211px;"> <figure class="captioned-image caption-none" style="width: 211px"><img alt="Figure 3: Google REST API custom server control at design time" src="/sites/devproconnections.com/files/uploads/2014/01/Figure%2003.jpg" style="width: 211px; height: 50px;" title="Figure 3: Google REST API custom server control at design time"><figcaption class="image-description">Figure 3: Google REST API custom server control at design time</figcaption></figure></div> <br><div class="contentimage" style="width: 310px;"> <figure class="captioned-image caption-none" style="width: 310px"><img alt="Figure 4: Smart-tag of Google REST API custom server control" src="/sites/devproconnections.com/files/uploads/2014/01/Figure%2004_0.jpg" style="width: 310px; height: 329px; border-width: 1px; border-style: solid;" title="Figure 4: Smart-tag of Google REST API custom server control"><figcaption class="image-description">Figure 4: Smart-tag of Google REST API custom server control</figcaption></figure></div> <p>The Google REST API custom control will have the properties and methods as listed in Figure 5.</p> <table border="1" cellpadding="1" cellspacing="1" style="width: 595px;"><thead><tr><th scope="col"> <strong>Property / Method</strong> </th> <th scope="col"> <strong>Description</strong> </th> </tr></thead><caption> <strong>Figure 5: Properties and methods of Google REST API control</strong> </caption> <tbody><tr><td> Url</td> <td> Indicates the Google URL for making REST calls. Though this URL is fixed we still make it as a property to accommodate any changes at later time.</td> </tr><tr><td> ApiKey</td> <td> An API Key required to use Google REST API.</td> </tr><tr><td> CustomSearchEngineId</td> <td> A unique ID of the custom search engine that you wish to use for searching.</td> </tr><tr><td> SearchCriteria</td> <td> Any search criteria string that you normally enter in search box.</td> </tr><tr><td> LanguageFilter</td> <td> By default search returns matching content without any language restriction. You can restrict the results to a particular language using this property.</td> </tr><tr><td> SafeSearchOption</td> <td> Governs safety level of the results. Possible values are Off, High and Medium.</td> </tr><tr><td> FilterDuplicateResults</td> <td> By default duplicate content is filtered but you can change the default using this property.</td> </tr><tr><td> SearchResultFormat</td> <td> The format in which search results are returned. Possible formats are JSON and ATOM.</td> </tr><tr><td> ClientCallbackName</td> <td> If you wish to deal with search results from client side script rather than server side code then you can specify a JavaScript function that handles the results.</td> </tr><tr><td> GetSearchResults()</td> <td> This method returns search results as a string. The string can contain JSON or ATOM data depending on the format specified using the SearchResultFormat property.</td> </tr><tr><td> GetSearchResultsAsSyndicationItems()</td> <td> Returns search results as ATOM feed items.</td> </tr><tr><td> GetClientScriptBlock()</td> <td> Returns a client side <script> block whose src attribute points to Google search service along with required query string parameters. Useful only if ClientCallbackName property is used.</td> </tr></tbody></table><h3> Creating a Custom Server Control Project</h3> <p>First we need to create a new project of type "ASP.NET Server Control". Figure 6 shows the new project dialog of Visual Studio.</p> <div class="contentimage" style="width: 390px;"> <figure class="captioned-image caption-none" style="width: 595px"><img alt="Figure 6: Creating a new ASP.NET Server Control project" src="/sites/devproconnections.com/files/uploads/2014/01/Figure%2006.jpg" style="width: 595px; height: 379px;" title="Figure 6: Creating a new ASP.NET Server Control project"><figcaption class="image-description">Figure 6: Creating a new ASP.NET Server Control project</figcaption></figure></div> <p>Give the project a name as GoogleRestApiControlLib. Then define two enumerations—SearchResultFormats and SafeSearchOptions. The former enumeration represents the data format for search results, namely JSON and ATOM. The later enumeration indicates the safe-searching levels, namely High, Medium, and Off. Figure 7 shows these enumerations.</p> <pre language="text" linenumbers="none" title="Figure 7: Defining required enumerations"> public enum SearchResultFormats { JSON, ATOM } public enum SafeSearchOptions { High, Medium, Off }</pre> <p>Now add a new class in the project and name it GoogleRestApiControl. The GoogleRestApiControl class represents the main custom control class and inherits from WebControl base class. Figure 8 shows the skeleton definition of GoogleRestApiControl.</p> <pre language="text" linenumbers="none" title="Figure 8: Skeleton of GoogleRestApiControl class"> namespace GoogleRestApiControlLib { [DefaultProperty("ApiKey")] [ToolboxData("<{0}:GoogleRestApiControl runat=server></{0}:GoogleRestApiControl>")] public class GoogleRestApiControl:WebControl { ... } }</pre> <p>Notice that the GoogleRestApiControl class is decorated with [DefaultProperty] and [ToolboxData] attributes. The [DefaultProperty] attribute specifies the name of the property that will be act as a default property for the control. Specifying ApiKey as the default property means that when you select the GoogleRestApiControl on the web form designer and open its Properties window, ApiKey property will be selected for editing by default. The [ToolboxData] attribute controls the server control tag name when the control is dragged and dropped from the Visual Studio toolbox.</p> <p>The GoogleRestApiControl class has all the properties as listed in Figure 5. We won't discuss all the properties here since all of them essentially store or retrieve property value to and from ViewState. Figure 9 shows the code for several of the properties.</p> <pre language="text" linenumbers="none" title="Figure 9: Some properties of GoogleRestApiControl class"> [Bindable(true)] [Category("API")] public string ApiKey { get { return ViewState["ApiKey"] as string; } set { ViewState["ApiKey"] = value; } } [Bindable(true)] [Category("Search")] public SearchResultFormats SearchResultFormat { get { if (ViewState["SearchResultFormat"]==null) { return SearchResultFormats.ATOM; } else { return (SearchResultFormats) ViewState["SearchResultFormat"]; } } set { ViewState["SearchResultFormat"] = value; } } ...</pre> <p>Notice the use of the [Bindable] and [Category] attributes. The former attribute indicates that a property can be used for binding, and the latter attribute specifies the category of the property. Both of these attributes are used to enhance design-time experience and don't affect the actual working of our control. For example, using [Category] attribute as shown in Figure 9 helps the Visual Studio Properties window to group the control properties, as shown in Figure 10.</p> <div class="contentimage" style="width: 220px;"> <span style="text-decoration: underline;"><figure class="captioned-image caption-none" style="width: 249px"><img alt="Figure 10: Properties grouped based on [Category] attribute." src="/sites/devproconnections.com/files/uploads/2014/01/Figure%2010.jpg" style="width: 249px; height: 442px;" title="Figure 10: Properties grouped based on [Category] attribute."><figcaption class="image-description">Figure 10: Properties grouped based on [Category] attribute.</figcaption></figure></span> </div> <h3> Searching Operation</h3> <p>Now that we have coded the properties of the GoogleRestApiControl, let's focus on implementing the actual searching operation. The three methods of GoogleRestApiControl control—GetSearchResults(), GetSearchResultsAsSyndicationItems(), and GetClientScriptBlock()—deal with the searching operation. They do so by making a REST call to the Google JSON/ATOM Custom Search API.</p> <p>The GetSearchResults() method is intended to be used by our server-side code to search a custom search engine programmatically. Figure 11 shows the complete code for the GetSearchResults() method.</p> <pre language="text" linenumbers="none" title="Figure 11: GetSearchResults() method"> public string GetSearchResults() { string targetUrl = this.Url + "?key=" + this.ApiKey + "&cx=" + this.CustomSearchEngineId + "&alt=" + this.SearchResultFormat.ToString() + "&q=" + HttpContext.Current.Server.UrlEncode(this.SearchCriteria) + "&filter=" + (this.FilterDuplicateResults ? 1 : 0); if (LanguageFilter != "" && LanguageFilter != null) { targetUrl += "&lr=" + LanguageFilter; } if (SafeSearchOption != SafeSearchOptions.Off) { targetUrl += "&safe=" + SafeSearchOption; } WebRequest request = null; WebResponse response = null; Stream responsestream = null; StreamReader reader = null; request = WebRequest.Create(targetUrl); response = request.GetResponse(); responsestream = response.GetResponseStream(); reader = new StreamReader(responsestream); string text = reader.ReadToEnd(); reader.Close(); responsestream.Close(); return text; }</pre> <p>The GetSearchResults() method first forms the URL as expected by Google's JSON/ATOM custom search API. Notice how various query string parameters are formed based on the property values. Especially notice the "q" query string parameter. Since we are writing this method in a class library, ASP.NET objects such as Server won't be available directly. We need to use the HttpContext class to access the Server object and then use UrlEncode() method to encode the search criteria.</p> <p>The code then programmatically makes a GET request to the URL we just formed using Create() method of the WebRequest class. The response stream is accessed using GetResponseStream() method of the WebResponse class. Finally, the StreamReader class reads the complete response stream as a string using ReadToEnd() method. The string thus obtained is returned to the calling code.</p> <p>The GetSearchResultsAsSyndicationItems() method uses the GetSearchResults() method discussed earlier and returns search results as a list of SyndicationItem objects. Figure 12 shows the complete code for this method.</p> <pre language="text" linenumbers="none" title="Figure 12: GetSearchResultsAsSyndicationItems() method"> public List<SyndicationItem> GetSearchResultsAsSyndicationItems() { string results = GetSearchResults(); byte[] byteArray = Encoding.ASCII.GetBytes(results); MemoryStream stream = new MemoryStream(byteArray); XmlTextReader reader = new XmlTextReader(stream); Atom10FeedFormatter atom = new Atom10FeedFormatter(); atom.ReadFrom(reader); stream.Close(); reader.Close(); return atom.Feed.Items.ToList(); }</pre> <p>Note that the GetSearchResultsAsSyndicationItems() method will work as expected only when the search result format is ATOM. The method first retrieves the search results as a string using GetSearchResults() method. The Atom10FeedFormatter class found in the System.ServiceModel.Syndication namespace serializes ATOM feeds. The ReadFrom() method of the Atom10FeedFormatter class expects an XmlReader from which the data is retrieved. Since the GetSearchResults() method returns a string, we first put it into a MemoryStream and wrap it in an object of type XmlTextReader. The reader is then passed to the ReadFrom() method. The Feed property of Atom10FeedFormatter class exposes the Items collection. Each element of the Items collection is of type SyndicationItem. The ToList() method converts the elements of Items collection into a generic list of SyndicationItem objects.</p> <p>The REST calls to the Google's JSON/ATOM custom search API can be invoked from client-side JavaScript, too. The GetClientScriptBlock() method essentially returns a JavaScript <script> block that can be emitted when the page is rendered (with or without post back). Figure 13 shows the complete code for the GetClientScriptBlock() method.</p> <pre language="text" linenumbers="none" title="Figure 13: GetClientScriptBlock() method"> public string GetClientScriptBlock() { string targetUrl = this.Url + "?key=" + this.ApiKey + "&cx=" + this.CustomSearchEngineId + "&alt=" + this.SearchResultFormat.ToString() + "&q=" + HttpContext.Current.Server.UrlEncode(this.SearchCriteria) + "&filter=" + (this.FilterDuplicateResults ? 1 : 0) + "&callback=" + this.ClientCallbackName; if (LanguageFilter != "" && LanguageFilter != null) { targetUrl += "&lr=" + LanguageFilter; } if (SafeSearchOption != SafeSearchOptions.Off) { targetUrl += "&safe=" + SafeSearchOption; } string script = "<script type='text/javascript' src='" + targetUrl + "'></script>"; return script; }</pre> <p>Notice the lines at callouts A and B. The URL is almost identical to the previous methods we developed, but we have also added "callback" query string parameter. Since the <script> block will be executed on the client side, there must be some function that handles the returned search results. The "callback" query string parameter specifies the name of this client-side function. The code then forms a <script> element whose src attribute points to the URL we just formed. The <script> block is then returned to the calling code.</p> <h3> More to Come</h3> <p>This completes the core functionality of the GoogleRestApiControl control. In the upcoming part 2 article in this series, we will revisit the GoogleRestApiControl to add smart tag and a few other designer features. Check the DevProConnections website soon for part 2!</p> <p><strong>Bipin Joshi</strong> (<a href="mailto:bipinjoshi@yahoo.com">bipinjoshi@yahoo.com</a>) has been programming since 1995 and has worked with .NET since its inception. He has authored or co-authored several books and numerous articles about .NET technologies. Bipin blogs about yoga and technology at <a href="http://bipinjoshi.com/" target="_blank">bipinjoshi.com</a>.</p> </div> <div class="secondary-tags"> TAGS: <a href="/software-development/microsoft-visual-studio" class="secondary-tag">Microsoft Visual Studio</a> <a href="/software-development" class="secondary-tag">Software Development</a> </div> <div class="comments-wrapper" id="comments-4894"> <div class="comments"> <a href="javascript:void(0)" class="comments--show hidden">0 comments</a> </div> <div class="comments-container"> <div class="fill-comments"> <div class="comments-header"><span class="comments--hide">Hide comments</span></div> <form class="comment-form" action="/comment/reply/4894" method="post" id="comment-form" accept-charset="UTF-8"><div><div class="user-comment-body"> <div class="user-comment-field"> <div class="user-photo"> <img class="user-thumb-img" src="https://www.itprotoday.com/sites/all/themes/penton_core_theme/images/account-default-image.png" alt="" /> </div> <div class="user-content"> <div class="user-name"> <a href="/" class="js-penton-user-url-profile"></a> </div> <div class="user-comment"> <div class="field-type-text-long field-name-comment-body field-widget-text-textarea form-wrapper" id="comment_body"><div id="comment-body-add-more-wrapper"><div class="text-format-wrapper"><div class="form-item form-type-textarea form-item-comment-body-und-0-value"> <label class="element-invisible" for="edit-comment-body-4894">Comment <span class="form-required" title="This field is required.">*</span></label> <div class="form-textarea-wrapper resizable"><textarea class="text-full ckeditor-mod form-textarea required" placeholder="Be the first to comment..." id="edit-comment-body-4894" name="comment_body[und][0][value]" cols="60" rows="5"></textarea></div> </div> <fieldset class="filter-wrapper element-invisible form-wrapper" id="edit-comment-body-und-0-format"><div class="fieldset-wrapper"><div class="filter-help form-wrapper" id="edit-comment-body-und-0-format-help"><p><a href="/filter/tips" target="_blank">More information about text formats</a></p></div><div class="form-item form-type-select form-item-comment-body-und-0-format"> <label for="edit-comment-body-und-0-format--2">Text format </label> <select class="filter-list form-select" id="edit-comment-body-und-0-format--2" name="comment_body[und][0][format]"><option value="comments" selected="selected">Comments</option><option value="plain_text">Plain text</option></select> </div> <div class="filter-guidelines form-wrapper" id="edit-comment-body-und-0-format-guidelines"><div class="filter-guidelines-item filter-guidelines-comments"><h3>Comments</h3><ul class="tips"><li>Allowed HTML tags: <em> <strong> <blockquote> <br> <p></li></ul></div><div class="filter-guidelines-item filter-guidelines-plain_text"><h3>Plain text</h3><ul class="tips"><li>No HTML tags allowed.</li><li>Web page addresses and e-mail addresses turn into links automatically.</li><li>Lines and paragraphs break automatically.</li></ul></div></div></div></fieldset> </div> <a href="#" class="element-invisible publish js-publish user-comment__publishbtn">Publish</a><span class='comment-error'><a href="/penton_modal/nojs/login" class="ctools-use-modal ctools-modal-modal-popup-login" rel="nofollow">Log in or register to comment</a></span></div></div> </div> </div> </div> </div> <input type="hidden" name="cid" value="" /> <input type="hidden" name="pid" value="" /> <input type="hidden" name="form_build_id" value="form-CqEe7ndH3ikSRlbTzbgq1YDb0_geoMa3S5WJ3mG3RCc" /> <input type="hidden" name="form_id" value="comment_node_article_form" /> <input type="hidden" name="honeypot_time" value="1539651158|pd9ZKANykCG3eVrlhS1lYd_nt-MCUbBO_UuJjdOV9zI" /> <input type="hidden" name="captcha_sid" value="47626338" /> <input type="hidden" name="captcha_token" value="735ac8116b3ff5847c30f810e80b6521" /> <div class="element-invisible"><div class="form-actions form-wrapper" id="edit-actions"><button id="edit-submit-4894" name="op" value="Save" class="form-submit">Save</button> </div></div><div class="url-textfield"><div class="form-item form-type-textfield form-item-url"> <label for="edit-url">Leave this field blank </label> <input autocomplete="off" type="text" id="edit-url" name="url" value="" size="20" maxlength="128" class="form-text" /> </div> </div></div></form> <div class="comments-inner-container"> </div> </div> </div> </div> </div> <div class="row related-articles-row"> <div class="related-articles-heading">Related</div><div class="related-articles-wrapper"><a href="/web-development/geo-tag-your-photos-using-aspnet-and-google-maps-part-i" class="small-article-link"><article class="small-article"><div class="small-article__inner"><div class="small-article__inner-title">Geo-tag Your Photos Using ASP.NET and Google Maps: Part I</div><span>Oct 30, 2009</span></div></article></a><a href="/web-development/search-google-aspnet" class="small-article-link"><article class="small-article"><div class="small-article__inner"><div class="small-article__inner-title">Search Google With ASP.NET</div><span>Oct 30, 2009</span></div></article></a><article class="dfp-ad-hideempty hidden n_hidden small-article" data-dfp-position="native_related"></article><a href="/web-development/working-google-maps-client-side-api" class="small-article-link"><article class="small-article"><div class="small-article__inner"><div class="small-article__inner-title">Working with the Google Maps Client-Side API</div><span>Oct 30, 2009</span></div></article></a><a href="/web-development/san-francisco-new-york-lead-us-wage-growth-thanks-big-tech" class="small-article-link"><article class="small-article"><div class="img-crop"><img class="js-imgpxr" data-x2src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_retina/public/GettyImages-922779642.jpg?itok=g5CpwfEi" src="https://www.itprotoday.com/sites/itprotoday.com/files/styles/article_related_thumb_standard/public/GettyImages-922779642.jpg?itok=3tOAsBP_" width="90" height="83" alt="San Francisco" /></div><div class="small-article__inner"><div class="small-article__inner-title">San Francisco, New York Lead U.S. Wage Growth Thanks to Big Tech</div><span>Oct 02, 2018</span></div></article></a></div> </div> <div class="item-list"><ul class="lazy-pagination"><li class="read-more pagination-read-more next first last"><a href="/cloud-data-center/paul-allen-billionaire-who-co-founded-microsoft-dies-65?parent=4894&infscr=1" rel="nofollow">Load More</a></li> </ul></div> </article> </section> </div> </div> </div> </div> <div class="banner-bottom-wrapper"> <div id="banner-bottom" class="dfp-ad-hideempty hidden"> <div data-dfp-position="bottom_banner"></div> </div> </div> <!-- /Main Content Area --> <!-- Footer --> <!-- Check to see if we are in the store --> <footer class="l-footer l-footer-min "> <div class="l-footer-inner"> <div class="l-footer-info"> <div class="footer-logo-min"> <a href="/"><img class="footer-logo-min__site_logo" src="https://www.itprotoday.com/sites/all/themes/penton_subtheme_itprotoday/images/logos/footer.png" alt="Logo" /></a> <div class="small-12 medium-5 columns"> <div class="footer-links"> <a href="https://informa.com/"><img src="/sites/all/themes/penton_core_theme/images/powered_by_informa_businessline.png" alt="Powered by Informa" /></a> </div> </div> </div> <ul class="footer-min-col"> <li class="footer-min-col__item"> <a href="/about-us" class="footer-min-col-link">About</a> </li> <li class="footer-min-col__item"> <a href="https://www.itprotoday.com/advertise-itprotodaycom" class="footer-min-col-link">Advertise</a> </li> <li class="footer-min-col__item"> <a href="/contact-us" class="footer-min-col-link">Contact Us</a> </li> <li class="footer-min-col__item"> <a href="/sitemap" class="footer-min-col-link">Sitemap</a> </li> </ul> <ul class="footer-min-col no-margin"> <li class="footer-min-col__item"> <a href="http://www.penton.com/privacy-policy#ThirdPartyAdvertisingTech" class="footer-min-col-link">Ad Choices</a> </li> <li class="footer-min-col__item"> <a href="http://engage.informa.com/privacy-statement" class="footer-min-col-link">Privacy Policy</a> </li> <li class="footer-min-col__item"> <a href="http://engage.informa.com/terms-of-service" class="footer-min-col-link">Terms of Service</a> </li> <li class="footer-min-col__item"> <a href="https://engage.informa.com/cp/cookie-policy/" class="footer-min-col-link">Cookie Policy</a> </li> </ul> <div class="social-min-col"> <p class="social-min-col__label">Follow us:</p> <div class="social-icons"><a href="https://www.facebook.com/ITProToday/" title="" class="social-icons__link"><i class="social-icons__icon fa fa-facebook"></i></a><a href="https://twitter.com/ITProToday" title="" class="social-icons__link"><i class="social-icons__icon fa fa-twitter"></i></a><a href="https://plus.google.com/115563256559407060026 " title="" class="social-icons__link"><i class="social-icons__icon fa fa-google-plus"></i></a><a href="https://www.linkedin.com/groups/1163947" title="" class="social-icons__link"><i class="social-icons__icon fa fa-linkedin"></i></a></div></div> </div> <div class="l-footer-rights"> <span class="copyrights"> © 2018 Informa USA, Inc., All Rights Reserved </span> </div> </div> </footer> <!-- /Footer --> </div> </div> </div> </main> <!-- /Page --> <div id="hidden-dfp" class="dfp-ad-hideempty hidden"> <div data-dfp-position="hidden" class="hidden-for-ads"></div> </div> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_KUtWmy_QP6atnDjXwpDAH183eelDuv-2PY5ksEFKvNQ.js"></script> <script type="text/javascript" src="https://www.googletagservices.com/tag/js/gpt.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_s3L_uC35AiN5EGYY533su-jccnLRp2aKpOnjgPLbo34.js"></script> <script type="text/javascript" src="//assets.adobedtm.com/2ebe67d2ca0193084439038012c34f9112a85c00/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_eOe-hGqK6-bRjj7DQYO_Y-oCu3MIoF2vYxLUbQbtu4I.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_2h17_kRDS97bAi9pF-W7es7DLWc108u3KeFxWQr035M.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- window.CKEDITOR_BASEPATH = "/sites/all/modules/contrib/ckeditor/ckeditor/" //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_FloLC-L2hL--gn7qKaXXBNWxL6qI_-SL4q2_WBFL5X4.js"></script> <script type="text/javascript" src="//video.limelight.com/player/embed.js"></script> <script type="text/javascript" src="https://embed.calculoid.com/scripts/combined.min.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_uk9tggR7LUt24uKijCBrSJ5qhPl8YykfBihM_uf9QrE.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_custom_dfp = {"dfp_tags":{"everywhere":[],"article":{"native_leftrail_1":[{"disabled":false,"api_version":1,"machinename":"article_native_leftrail_1","slot":"[article] Native Left Rail 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_leftrail_1","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_1_lft"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_1_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"native_leftrail_2":[{"disabled":false,"api_version":1,"machinename":"article_native_leftrail_2","slot":"[article] Native Left Rail 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_leftrail_2","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_2_lft"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_2_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"native_related":[{"disabled":false,"api_version":1,"machinename":"article_native_related","slot":"[article] Native Related","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_related","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_12_1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_12_1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"native_inline":[{"disabled":false,"api_version":1,"machinename":"article_native_inline","slot":"[article] Native Inline","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_inline","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_13_1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_13_1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"right_rail_rect":[{"disabled":false,"api_version":1,"machinename":"_article_right_rail_rect","slot":"[article] [article] Right rail rect","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"right_rail_rect","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"native_umpu":[{"disabled":false,"api_version":1,"machinename":"article_native_umpu","slot":"[article] Native Umpu","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"native_umpu","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_3"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_3"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"inarticle1":[{"disabled":false,"api_version":1,"machinename":"article_300_1_rht_infinite","slot":"[article] Rectangle Inline 1","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle1","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"inarticle2":[{"disabled":false,"api_version":1,"machinename":"article_300_2_rht_infinite","slot":"[article] Rectangle Inline 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle2","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_2_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"inarticle3":[{"disabled":false,"api_version":1,"machinename":"article_300_3_rht_infinite","slot":"[article] Rectangle Inline 3","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle3","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_3_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"inarticle4":[{"disabled":false,"api_version":1,"machinename":"article_300_4_rht_infinite","slot":"[article] Rectangle Inline 4","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticle4","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_4_rht"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"left_rail_rect":[{"disabled":false,"api_version":1,"machinename":"article_300_x_lft","slot":"[article] Left rail 300_x_lft","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[300,250],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"left_rail_rect","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_lft"}],"breakpoints":[{"browser_size":"779x0","ad_sizes":"300x250"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_lft"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"jumbotron":[{"disabled":false,"api_version":1,"machinename":"article_300_x_rht","slot":"[article] Rectangle Inline and Jumbotron","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[300,250],[300,600]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"jumbotron","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"300_1_rht"}],"breakpoints":[{"browser_size":"0x0","ad_sizes":"300x250"},{"browser_size":"779x0","ad_sizes":"300x250,300x600"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[300,250],"browser_size":[0,0]},{"ad_sizes":[[300,250],[300,600]],"browser_size":[779,0]}],"targeting":[{"target":"pos","value":"300_1_rht"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"top_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_1_a","slot":"[article] Leaderboard 728_1_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[970,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"top_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_1_a"},{"target":"program","value":"[node:program_without_space_specialchars]"},{"target":"ptype","value":"[node:field_penton_article_type]"},{"target":"nid","value":"[node:nid]"},{"target":"pterm","value":"[node:pterm_without_space_specialchars]"},{"target":"sterm","value":"[node:sterm_without_space_specialchars]"},{"target":"author","value":"[node:author_without_space_specialchars]"},{"target":"combo","value":"wrap"},{"target":"content","value":"[node:program_without_space_specialchars]"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"970x90,728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[[970,90],[728,90]],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_1_a"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"bottom_banner":[{"disabled":false,"api_version":1,"machinename":"article_728_footer","slot":"[article] Leaderboard 728_10_a","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"bottom_banner","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_10_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_10_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"hidden":[{"disabled":false,"api_version":1,"machinename":"article_canopy","slot":"[article] Canopy","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"adhesion"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"adhesion"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_footnote_floor","slot":"[article] Footnote_Floor","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"footnote"},{"target":"gdpr_banner","value":"off"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"footnote"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_oop","slot":"[article] Out of Page","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[0,0],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"oop_a"},{"target":"gdpr_banner","value":"off"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"oop_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]},{"disabled":false,"api_version":1,"machinename":"article_pagewrap","slot":"[article] PageWrap","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":1,"slug":"","short_tag":0,"location":"article","position":"hidden","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"}],"breakpoints":[{"browser_size":"1500x0","ad_sizes":"1x1"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[1,1],"browser_size":[1500,0]}],"targeting":[{"target":"pos","value":"wrap"},{"target":"combo","value":"wrap"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_header":[{"disabled":false,"api_version":1,"machinename":"article_ccc_header","slot":"[article] Article CCC header","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[160,65],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_header","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"custom_content_channel_sponsored_resources":[{"disabled":false,"api_version":1,"machinename":"article_ccc_resources","slot":"[article] Article CCC resources","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[160,65],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"custom_content_channel_sponsored_resources","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"customsponsoredlogo2"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"customsponsoredlogo2"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"inarticlevid":[{"disabled":false,"api_version":1,"machinename":"article_in_article_video_ad","slot":"[article] In-Article Video Ad","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[1,1],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"inarticlevid","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"inarticlevideo_1_a"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"infinitescroll":[{"disabled":false,"api_version":1,"machinename":"article_interscroller_728_x_a","slot":"[article] Interscroller\/Leaderboard 2","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[728,90],[320,50]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"infinitescroll","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"728_2_a"}],"breakpoints":[{"browser_size":"1119x0","ad_sizes":"728x90"},{"browser_size":"728x0","ad_sizes":"728x90"},{"browser_size":"0x0","ad_sizes":"320x50"}]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[{"ad_sizes":[728,90],"browser_size":[1119,0]},{"ad_sizes":[728,90],"browser_size":[728,0]},{"ad_sizes":[320,50],"browser_size":[0,0]}],"targeting":[{"target":"pos","value":"728_2_a"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo","slot":"[article] Sponsored Logo","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"sponsoredlogo"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}],"sponsored_logo_weather":[{"disabled":false,"api_version":1,"machinename":"article_sponsored_logo_weather","slot":"[article] Sponsored Logo Weather","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":[[160,65],[125,125],[90,90]],"block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"article","position":"sponsored_logo_weather","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"sponsoredlogo_weather"},{"target":"article_number","value":"1"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"sponsoredlogo_weather"},{"target":"article_number","value":"1"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}]},"taxonomy":{"native_article_4":[{"disabled":false,"api_version":1,"machinename":"term_native_article_4","slot":"[taxonomy] Native Article 4","adunit":"\/3834\/itprotoday.home\/article\/software_development\/web_development","size":"fluid","block":0,"settings":{"out_of_page":0,"slug":"","short_tag":0,"location":"taxonomy","position":"native_article_4","adsense_ad_types":"","adsense_channel_ids":"","adsense_colors":{"background":"","border":"","link":"","text":"","url":""},"targeting":[{"target":"pos","value":"nativekey_10"}],"breakpoints":[]},"export_module":"penton_dfp","type":"Default","export_type":2,"in_code_only":true,"table":"dfp_tags","breakpoints":[],"targeting":[{"target":"pos","value":"nativekey_10"},{"target":"ptype","value":"Article"},{"target":"nid","value":"4894"},{"target":"pterm","value":"web_development"},{"target":"sterm","value":"microsoft_visual_studio,software_development"},{"target":"author","value":"bipin_joshi"},{"target":"reg","value":"anonymous"}]}]}},"current_type":"article","default_adunit":"\/3834\/itprotoday.home","async_rendering":1,"single_request":0,"collapse_empty_divs":"1","viewport":1,"lifetime_banner":"2000","do_byline":0,"enable_sticky":1,"enable_cb_refresh":0,"cb_refresh_interval":"15","is_blocked_ip":false,"uip":"54.156.39.245"}; //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_m0Qm7ZLBa0Us5bK_pvZ1T3hMtRZOtWiklopETCWH6Qk.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- Drupal.settings.penton_eloqua_api = {"fields":["nl","utm_rid"]}; //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_2QLg0QavkHsRBi6FWUcTxM-mYPG7L5TNgt9uS3ypY4Q.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_C3Oq_2WmTdDwWwi0aeViDSNHfrYR_mwn7Gj89E6Ojx0.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_KIwLxGMqoJtHLuCU1tBsjwRtZcXqJAAPjkc5R7V3izE.js"></script> <script type="text/javascript"> <!--//--><![CDATA[//><!-- jQuery.extend(Drupal.settings, {"basePath":"\/","pathPrefix":"","ajaxPageState":{"theme":"penton_subtheme_itprotoday","theme_token":"SuczSEN6_6CcmI3pUcBNqlMCvkSmUIOXNpWvD4A5gLI","jquery_version":"1.10","js":{"sites\/all\/modules\/custom\/penton_gdpr\/js\/penton_gdpr.js":1,"sites\/all\/modules\/contrib\/ckeditor\/includes\/ckeditor.utils.js":1,"sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/ckeditor.js":1,"sites\/all\/modules\/custom\/penton_adobe_dtm\/js\/penton_adobe_dtm.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery\/1.10\/jquery.min.js":1,"misc\/jquery.once.js":1,"https:\/\/www.googletagservices.com\/tag\/js\/gpt.js":1,"misc\/drupal.js":1,"\/\/assets.adobedtm.com\/2ebe67d2ca0193084439038012c34f9112a85c00\/satelliteLib-48191dfa1509ee2d203e3f6eb4bc8a3de3320ce9.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/ui\/minified\/jquery.ui.core.min.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/ui\/external\/jquery.cookie.js":1,"sites\/all\/modules\/contrib\/jquery_update\/replace\/jquery.form\/4\/jquery.form.min.js":1,"misc\/form.js":1,"misc\/ajax.js":1,"sites\/all\/modules\/contrib\/jquery_update\/js\/jquery_update.js":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_user_registration.js":1,"sites\/all\/modules\/custom\/penton_user_register\/js\/penton_user_register.js":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.js":1,"0":1,"sites\/all\/modules\/custom\/penton_modal\/js\/penton_modal_popup.js":1,"\/\/video.limelight.com\/player\/embed.js":1,"https:\/\/embed.calculoid.com\/scripts\/combined.min.js":1,"sites\/all\/modules\/contrib\/authcache\/authcache.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/data-render.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/viewport.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.dom.js":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.iframe.js":1,"1":1,"sites\/all\/modules\/custom\/penton_custom_dfp\/js\/dfp.sticky.js":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/eloqua_tracking.js":1,"2":1,"sites\/all\/modules\/custom\/penton_eloqua_api\/js\/cookies.helper.js":1,"misc\/progress.js":1,"sites\/all\/modules\/contrib\/ctools\/js\/modal.js":1,"sites\/all\/modules\/custom\/penton_social\/js\/penton_social.js":1,"sites\/all\/modules\/contrib\/prevent_js_alerts\/prevent_js_alerts.js":1,"sites\/all\/modules\/contrib\/captcha\/captcha.js":1,"sites\/all\/modules\/custom\/penton_comment\/scripts\/comments.js":1,"sites\/all\/modules\/contrib\/service_links\/js\/pinterest_button.js":1,"misc\/textarea.js":1,"modules\/filter\/filter.js":1,"sites\/all\/themes\/penton_core_theme\/public\/scripts.js":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/client.js":1,"sites\/all\/modules\/custom\/penton_legal_comm\/js\/alert.js":1},"css":{"modules\/system\/system.base.css":1,"modules\/system\/system.menus.css":1,"modules\/system\/system.messages.css":1,"modules\/system\/system.theme.css":1,"misc\/ui\/jquery.ui.core.css":1,"misc\/ui\/jquery.ui.theme.css":1,"modules\/book\/book.css":1,"modules\/comment\/comment.css":1,"sites\/all\/modules\/contrib\/date\/date_api\/date.css":1,"modules\/field\/theme\/field.css":1,"sites\/all\/modules\/contrib\/logintoboggan\/logintoboggan.css":1,"modules\/node\/node.css":1,"modules\/search\/search.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_file\/uc_file.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_order\/uc_order.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_product\/uc_product.css":1,"sites\/all\/modules\/contrib\/ubercart\/uc_store\/uc_store.css":1,"modules\/user\/user.css":1,"sites\/all\/modules\/contrib\/views\/css\/views.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css":1,"sites\/all\/modules\/features\/penton_people_search\/penton_people_search.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/ctools.css":1,"sites\/all\/modules\/contrib\/ctools\/css\/modal.css":1,"sites\/all\/modules\/contrib\/forward\/forward.css":1,"sites\/all\/modules\/contrib\/print\/print_ui\/css\/print_ui.theme.css":1,"sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.editor.css":1,"modules\/filter\/filter.css":1,"sites\/itprotoday.com\/files\/honeypot\/honeypot.css":1,"sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css":1,"sites\/all\/themes\/penton_core_theme\/public\/vendor.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css":1,"sites\/all\/themes\/penton_core_theme\/public\/override\/user.css":1,"sites\/all\/themes\/penton_core_theme\/public\/style.ie9.css":1,"https:\/\/embed.calculoid.com\/styles\/main.css":1}},"authcache":{"q":"node\/4894","cp":{"path":"\/","domain":".www.itprotoday.com","secure":true},"cl":390},"typekitId":"njq2hxj","adunit":"\/3834\/itprotoday.home","polar_property_id":"NA-ITPRCOM-11238907","is_new_welcome_ad":1,"is_new_article_view":false,"penton_eloqua_api":{"eloqua_site_id":null,"tracking_enabled":null},"CToolsModal":{"loadingText":"Loading...","closeText":"Close Window","closeImage":"\u003Cimg src=\u0022https:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/icon-close-window.png\u0022 alt=\u0022Close window\u0022 title=\u0022Close window\u0022 \/\u003E","throbber":"\u003Cimg src=\u0022https:\/\/www.itprotoday.com\/sites\/all\/modules\/contrib\/ctools\/images\/throbber.gif\u0022 alt=\u0022Loading\u0022 title=\u0022Loading...\u0022 \/\u003E"},"modal-popup-small":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-medium":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-large":{"modalSize":{"type":"scale","width":0.8,"height":0.8},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopup"},"modal-popup-x-large":{"modalSize":{"type":"scale","width":1100,"height":850},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupXLarge"},"modal-popup-basic":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasic"},"modal-popup-basic-email":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupBasicEmail"},"modal-popup-advanced":{"modalSize":{"type":"fixed","width":550,"height":450},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupAdvanced"},"modal-popup-login":{"modalSize":{"type":"fixed","width":545,"height":485},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","modalTheme":"PentonModalPopupLogin"},"modal-popup-legal-comm":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupLegalComm"},"modal-popup-validation-prompt":{"modalSize":{"type":"fixed","width":300,"height":300},"modalOptions":{"opacity":0.5,"background":"#000"},"animation":"fadeIn","closeText":"Close","modalTheme":"PentonModalPopupValidationPrompt"},"gdpr_countries":[],"prevent_js_alerts":{"module_path":"sites\/all\/modules\/contrib\/prevent_js_alerts"},"ws_pb":{"countlayout":"horizontal"},"penton_adobe_dtm":{"user":{"profile":{"profileInfo":{"profileID":"null"}},"segment":{"loginStatus":"unreg","permission":"anonymous"}},"page":{"pageInfo":{"pageName":"Create a Custom Control to Wrap the Google JSON\/ATOM Custom Search API, Part 1","pageID":"d1163214-795d-46b6-8a75-9ad9819a61f1","author":"Bipin Joshi","issueDate":"May 18, 2011"},"destinationURL":"https:\/\/www.itprotoday.com\/web-development\/create-custom-control-wrap-google-jsonatom-custom-search-api-part-1","category":{"pageType":"article","primaryCategory":"Software Development \u003E Web Development"},"attributes":{"taxonomy":"Web Development|Microsoft Visual Studio|Software Development","permission":"public","subType1":"Article","subType2":"","visibility":"visible","programs":"","scrollCount":"10","scrollPosition":"1_of_10","countsTowardGoal":""}}},"penton_adobe_dtm_events":[],"penton_gdpr":{"banner":"\u003Cdiv\u003E\n \u003Cdiv class=\u0022gdpr-popup-border\u0022\u003E\n \u003Cdiv class=\u0022gdrp-popup-content\u0022\u003E\n \u003Cdiv id=\u0022popup-text\u0022\u003E\n This website uses cookies, including third party ones, to allow for analysis of how people use our website in order to improve your experience and our services. By continuing to use our website, you agree to the use of such cookies. Click here for more information on our \u003Ca href=\u0022http:\/\/corporate.knect365.com\/privacy-centre\/our-cookie-policy\/\u0022 target=\u0022_blank\u0022\u003ECookie Policy\u003C\/a\u003E and \u003Ca href=\u0022https:\/\/knect365.com\/privacy-policy\u0022 target=\u0022_blank\u0022\u003EPrivacy Policy\u003C\/a\u003E.\u200b \u003C\/div\u003E\n \u003Cdiv id=\u0022popup-buttons\u0022\u003E\n \u003Cspan class=\u0022close-button\u0022\u003E\u0026times;\u003C\/span\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n \u003C\/div\u003E\n\u003C\/div\u003E\n"},"ckeditor":{"input_formats":{"comments":{"customConfig":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.config.js?","defaultLanguage":"en","toolbar":"[\n [\u0027Bold\u0027,\u0027Italic\u0027,\u0027Blockquote\u0027]\n]","enterMode":1,"shiftEnterMode":2,"toolbarStartupExpanded":true,"width":"100%","skin":"bootstrapck","format_tags":"p;div;pre;address;h1;h2;h3;h4;h5;h6","show_toggle":"f","default":"f","ss":2,"loadPlugins":[],"entities":false,"entities_greek":false,"entities_latin":false,"scayt_autoStartup":false,"language":"en","scayt_sLang":"en_US","js_conf":{"extraPlugins":"\u0027autogrow\u0027","autoGrow_minHeight":"100","autoGrow_maxHeight":"600","fullPage":true},"stylesCombo_stylesSet":"drupal:\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor.styles.js","contentsCss":["\/sites\/all\/themes\/penton_subtheme_itprotoday\/public\/style.css?pfzava","\/sites\/all\/themes\/penton_core_theme\/public\/vendor.css?pfzava","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.messages.css?pfzava","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.base.css?pfzava","\/sites\/all\/themes\/penton_core_theme\/public\/override\/system.menus.css?pfzava","\/sites\/all\/themes\/penton_core_theme\/public\/override\/user.css?pfzava","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?pfzava","\/sites\/all\/modules\/contrib\/ckeditor\/css\/ckeditor.css?pfzava"]}},"plugins":[],"textarea_default_format":{"edit-comment-body-4894":"comments"},"module_path":"\/sites\/all\/modules\/contrib\/ckeditor","editor_path":"\/sites\/all\/modules\/contrib\/ckeditor\/ckeditor\/","ajaxToken":"ly3I5pE1i5aC1g94dJ_dQQ3fuINHE_0otgk1WZvCXy0","xss_url":"\/ckeditor\/xss","theme":"penton_subtheme_itprotoday","elements":{"edit-comment-body-4894":"comments"},"scayt_language":"en_US"},"ajax":{"edit-submit-4894":{"callback":"penton_comment_comment_add","event":"mousedown","keypress":true,"prevent":"click","url":"\/system\/ajax","submit":{"_triggering_element_name":"op","_triggering_element_value":"Save"}}},"urlIsAjaxTrusted":{"\/system\/ajax":true,"\/comment\/reply\/4894":true}}); //--><!]]> </script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_39wR4vuLCUZcIK_NsEhVLhl6834Dd3heLLFQ5DLVNsc.js"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/all/modules/contrib/ckeditor/ckeditor/ckeditor.js?pfzava"></script> <script type="text/javascript" src="https://www.itprotoday.com/sites/itprotoday.com/files/js/js_hTvEvnr-CSP0ayePYXq_lDVR4Xlir2rUBDh7jP_21fI.js"></script> </div> </body> </html>